草庐IT

android - 错误 - android.database.CursorIndexOutOfBoundsException : Index 0 requested,,大小为 0

coder 2023-12-11 原文

我正在尝试做一个数据库,但是我有一个问题...

这是日志:

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/

有关android - 错误 - android.database.CursorIndexOutOfBoundsException : Index 0 requested,,大小为 0的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“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看起来疯狂不安全。所以,功能正常,

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循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

  4. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  5. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到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

  6. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个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

  7. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在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

  8. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  9. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个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

  10. arrays - 这是 Ruby 中 Array.fill 方法的错误吗? - 2

    这个问题在这里已经有了答案: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]]

随机推荐