我正在尝试做一个数据库,但是我有一个问题...
这是日志:
E/AndroidRuntime(894): FATAL EXCEPTION: main
E/AndroidRuntime(894): java.lang.IllegalStateException: Could not execute method of the activity
E/AndroidRuntime(894): at android.view.View$1.onClick(View.java:3044)
E/AndroidRuntime(894): at android.view.View.performClick(View.java:3511)
E/AndroidRuntime(894): at android.view.View$PerformClick.run(View.java:14105)
E/AndroidRuntime(894): at android.os.Handler.handleCallback(Handler.java:605)
E/AndroidRuntime(894): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(894): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(894): at android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime(894): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(894): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(894): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime(894): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime(894): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(894): Caused by: java.lang.reflect.InvocationTargetException
E/AndroidRuntime(894): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(894): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(894): at android.view.View$1.onClick(View.java:3039)
E/AndroidRuntime(894): ... 11 more
E/AndroidRuntime(894): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
E/AndroidRuntime(894): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:400)
E/AndroidRuntime(894): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
E/AndroidRuntime(894): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74)
E/AndroidRuntime(894): at and.mGroup.VirtualTrener.DatabaseControl.fetchItemByType(DatabaseControl.java:59)
E/AndroidRuntime(894): at and.mGroup.VirtualTrener.DatabaseManageActivity.onClick(DatabaseManageActivity.java:48)
E/AndroidRuntime(894): ... 14 more
这是 DatabaseControl.java:
public class DatabaseControl {
private static final String KEY_ROWID = "_id";
private static final String KEY_NAME = "NAME";
private static final String KEY_BKI = "BKI";
private static final String KEY_CKM = "CKM";
private static final String DATABASE_TABLE ="inventory";
private Context context;
private SQLiteDatabase database;
private DatabaseHelper dbHelper;
public DatabaseControl(Context context){
this.context = context;
}
public DatabaseControl open() throws SQLiteException {
dbHelper = new DatabaseHelper(context);
database = dbHelper.getWritableDatabase();
return this;
}
public void close () {
dbHelper.close();
}
public long addItem(String NAME, int BKI, int CKM) {
ContentValues setUpVals = CreateContentValues(NAME,BKI,CKM);
return database.insert(DATABASE_TABLE, null, setUpVals);
}
public boolean updateItem (long id, String NAME, int BKI, int CKM){
ContentValues updateVals = CreateContentValues(NAME,BKI,CKM);
return database.update(DATABASE_TABLE, updateVals, KEY_ROWID + "="+ id, null) > 0;
}
public long fetchItemByType(String type){
Cursor dbCursor;
long id =0;
try {
dbCursor = database.query(true, DATABASE_TABLE, new String[]{KEY_ROWID},KEY_NAME + "= '" + type + "'" , null, null, null, null, null);
dbCursor.moveToFirst();
id = dbCursor.getLong(dbCursor.getColumnIndex(KEY_ROWID));
} catch (SQLiteException e) {
id = -1;
}
return id;
}
public String fetchAllItems(){
String allData = "";
Cursor dbCursor;
try {
dbCursor = database.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_BKI, KEY_CKM}, null, null, null, null, null);
//dbCursor.getCount();
int iRow = dbCursor.getColumnIndex(KEY_ROWID);
int iName = dbCursor.getColumnIndex(KEY_NAME);
int iBKI = dbCursor.getColumnIndex(KEY_BKI);
int iCKM = dbCursor.getColumnIndex(KEY_CKM);
for (dbCursor.moveToFirst(); !dbCursor.isAfterLast(); dbCursor.moveToNext())
{
allData = allData + " " + dbCursor.getString(iRow) + "\t" + dbCursor.getString (iName) + "\t" + dbCursor.getString (iBKI) + "\t" + dbCursor.getString (iCKM) + "\n";
}
} catch (Exception e) {
// TODO Auto-generated catch block
allData = "";
}
return allData;
}
public boolean deleteItem(long id){
return database.delete(DATABASE_TABLE, KEY_ROWID + "=" + id, null) > 0;
}
private ContentValues CreateContentValues(String nAME, int bKI, int cKM) {
// TODO Auto-generated method stub
ContentValues values = new ContentValues();
values.put(KEY_NAME, nAME);
values.put(KEY_BKI, bKI);
values.put(KEY_CKM, cKM);
return values;
}
}
这是 DatabaseHelper.java:
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "ItemInventorydb";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE = "CREATE TABLE inventory (" +
"_id integer PRIMARY KEY AUTOINCREMENT," +
"NAME text," +
"BKI integer," +
"CKM integer" +
");";
public DatabaseHelper (Context context){
super(context, DATABASE_NAME,null,DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXIST inventory");
onCreate(db);
}
}
这是 DatabaseManageActivity.java:
public class DatabaseManageActivity extends Activity {
private EditText nazwaInput;
private EditText bkiInput;
private EditText ckmInput;
private DatabaseControl dbControl;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.wejscie_sesje);
dbControl = new DatabaseControl(this);
nazwaInput = (EditText) findViewById(R.id.name);
}
public void onClick(View arg){
String nazwaData = nazwaInput.getText().toString().toLowerCase();
//String bkiData = bkiInput.getText().toString();
//String ckmData = ckmInput.getText().toString();
Dialog notice = new Dialog(this);
TextView msgBody = new TextView(this);
msgBody.setTextSize(20);
long tempVal =0;
switch (arg.getId()){
case R.id.addItem:
try {
//int bkiDataAsNum =Integer.parseInt(bkiData);
//int ckmDataAsNum =Integer.parseInt(ckmData);
int bkiDataAsNum = 3500;
int ckmDataAsNum = 24;
dbControl.open();
if ((tempVal = dbControl.fetchItemByType(nazwaData)) != -1){
if(dbControl.updateItem(tempVal, nazwaData, bkiDataAsNum, ckmDataAsNum)){
notice.setTitle("Zaktualizowano!");
msgBody.setText("Item, który istniał zostal zaktualizowany");
}
else {
notice.setTitle("Aktualizacja zakończona niepowodzeniem");
msgBody.setText("Item, ktory istniał nie został zaktualizowany");
}
}
else {
long rowId =0;
rowId = dbControl.addItem(nazwaData, bkiDataAsNum, ckmDataAsNum);
notice.setTitle("Item umieszczony!");
msgBody.setText("Item umieszczony na pozycji" + rowId);
}
dbControl.close();
}
catch (SQLiteException e) {
e.printStackTrace();
notice.setTitle("Umieszczenie zakończone niepowodzeniem !");
msgBody.setText("Błąd SQL");
}
catch (NumberFormatException e) {
e.printStackTrace();
notice.setTitle("Umieszczenie zakończone niepowodzeniem!");
msgBody.setText("Wartość musi być wartością numeryczną!");
}
notice.setContentView(msgBody);
notice.show();
break;
case R.id.updateItem:
try{
//int bkiDataAsNum =Integer.parseInt(bkiData);
int bkiDataAsNum = 3500;
int ckmDataAsNum = 24;
//int ckmDataAsNum =Integer.parseInt(ckmData);
dbControl.open();
if ((tempVal = dbControl.fetchItemByType(nazwaData)) != -1){
if(dbControl.updateItem(tempVal, nazwaData, bkiDataAsNum, ckmDataAsNum)){
notice.setTitle("Zaktualizowano!");
msgBody.setText("Item, zostal zaktualizowany");
}
else {
notice.setTitle("Aktualizacja zakończona niepowodzeniem");
msgBody.setText("Aktualizacja zakończona niepowodzeniem, nie znaleziono rekordów");
}
}
else
{
notice.setTitle("Aktualizacja zakończona niepowodzeniem");
msgBody.setText("Item nie został znaleziony!");
}
dbControl.close();
}
catch (SQLiteException e) {
e.printStackTrace();
notice.setTitle("Update zokończony niepowodzeniem!");
msgBody.setText("Błąd SQL");
}
catch (NumberFormatException e) {
e.printStackTrace();
notice.setTitle("Update zokończony niepowodzeniem!");
msgBody.setText("Wartość musi być wartością numeryczną!");
}
notice.setContentView(msgBody);
notice.show();
break;
case R.id.deleteItem:
try{
dbControl.open();
if ((tempVal = dbControl.fetchItemByType(nazwaData)) != -1){
if(dbControl.deleteItem(tempVal)){
notice.setTitle("Usunięto!");
msgBody.setText("Item, zostal usunięty");
}
else {
notice.setTitle("Usunięcie zakończone niepowodzeniem");
msgBody.setText("Usunięcie zakończone niepowodzeniem, nie znaleziono rekordów");
}
}
else
{
notice.setTitle("Usunięcie zakończone niepowodzeniem");
msgBody.setText("Item nie został znaleziony!");
}
dbControl.close();
}
catch (SQLiteException e) {
e.printStackTrace();
notice.setTitle("Usunięcie zakończone niepowodzeniem!");
msgBody.setText("Błąd SQL");
}
notice.setContentView(msgBody);
notice.show();
break;
case R.id.viewData:
Intent i = new Intent("android.intent.action.DatabaseViewer");
startActivity(i);
break;
default:
}
}}
和DatabaseViewer.java:
public class DatabaseViewer extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.dataview);
TextView content = (TextView) findViewById(R.id.dataOutput);
DatabaseControl control = new DatabaseControl(this);
String result = "_id\t NAME\t BKI\t CKM \n ";
try {
control.open();
result = result + ""+ control.fetchAllItems();
control.close();
}
catch (SQLiteException e) {
e.printStackTrace();
}
content.setText(result);
}
}
我不知道哪里出了问题...你能帮帮我吗?很好,当您回答时,您将使用简单易懂的语言。
最佳答案
在 fetchItemByType 中检查 cursor.moveToFirst() 是否返回 true 如果没有,那么您没有任何数据,您可以返回 -1。
我认为 CursorIndexOutOfBoundsException 没有在您的程序中被捕获并且 0 从 fetchItemByType 函数返回。
关于android - 错误 - android.database.CursorIndexOutOfBoundsException : Index 0 requested,,大小为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10573985/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa
这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]