Получить из SQLite в массив с ошибкой - PullRequest
0 голосов
/ 05 марта 2012

Я получаю сообщение об ошибке при попытке извлечь из SQLite в массив.Я определил причину ошибки в цикле for, ошибку в операторе

urlString[i] = allrows.getString(0);

Я попытался отладить ее, но все еще не знаю, как ее решить.Метод, как показано ниже:

public String[] getImgURL(){
        mydb = localContext.openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
        Cursor allrows  = mydb.rawQuery("SELECT ImgURL FROM "+  TABLE, null);
        String[] urlString = new String[allrows.getCount()-1];
        for (int i = 1; i < allrows.getCount(); i++) {
            urlString[i] = allrows.getString(0);
            allrows.moveToNext();               
        }
        allrows.close();    
        mydb.close();
        return urlString;
}

журнал следующим образом

03-06 01:26:05.479: W/dalvikvm(27671): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)    
03-06 01:26:05.479: E/AndroidRuntime(27671): FATAL EXCEPTION: main    
03-06 01:26:05.479: E/AndroidRuntime(27671): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.testing/com.ip.scan.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 5    
03-06 01:26:05.479: E/AndroidRuntime(27671):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java)    
03-06 01:26:05.479: E/AndroidRuntime(27671):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java)    
03-06 01:26:05.479: E/AndroidRuntime(27671):    at android.app.ActivityThread.access$1500(ActivityThread.java)    
03-06 01:26:05.479: E/AndroidRuntime(27671):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java)    
03-06 01:26:05.479: E/AndroidRuntime(27671):    at android.os.Handler.dispatchMessage(Handler.java)    
03-06 01:26:05.479: E/AndroidRuntime(27671):    at android.os.Looper.loop(Looper.java)    
03-06 01:26:05.479: E/AndroidRuntime(27671):    at android.app.ActivityThread.main(ActivityThread.java)
03-06 01:26:05.479: E/AndroidRuntime(27671):    at java.lang.reflect.Method.invokeNative(Native Method)
03-06 01:26:05.479: E/AndroidRuntime(27671):    at java.lang.reflect.Method.invoke(Method.java:507)
03-06 01:26:05.479: E/AndroidRuntime(27671):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
03-06 01:26:05.479: E/AndroidRuntime(27671):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
03-06 01:26:05.479: E/AndroidRuntime(27671):    at dalvik.system.NativeStart.main(Native Method)
03-06 01:26:05.479: E/AndroidRuntime(27671): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 5
03-06 01:26:05.479: E/AndroidRuntime(27671):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java)
03-06 01:26:05.479: E/AndroidRuntime(27671):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java)
03-06 01:26:05.479: E/AndroidRuntime(27671):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java)
03-06 01:26:05.479: E/AndroidRuntime(27671):    at com.ip.scan.LocalSQLite.getImgURL(LocalSQLite.java:57)
03-06 01:26:05.479: E/AndroidRuntime(27671):    at com.ip.scan.MainActivity.onCreate(MainActivity.java:32)
03-06 01:26:05.479: E/AndroidRuntime(27671):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java)
03-06 01:26:05.479: E/AndroidRuntime(27671):    ... 12 more
03-06 01:26:05.549: D/dalvikvm(27671): GC_CONCURRENT freed 220K, 41% free 3334K/5639K, external 0K/0K, paused 3ms+2ms
03-06 01:26:05.549: E/Database(27671): close() was never explicitly called on database '/data/data/com.test.testing/databases/vege.db' 
03-06 01:26:05.549: E/Database(27671): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
03-06 01:26:05.549: E/Database(27671):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java)
03-06 01:26:05.549: E/Database(27671):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java)
03-06 01:26:05.549: E/Database(27671):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java)
03-06 01:26:05.549: E/Database(27671):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java)
03-06 01:26:05.549: E/Database(27671):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java)
03-06 01:26:05.549: E/Database(27671):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java)
03-06 01:26:05.549: E/Database(27671):  at com.ip.scan.LocalSQLite.getImgURL(LocalSQLite.java:53)
03-06 01:26:05.549: E/Database(27671):  at com.ip.scan.MainActivity.onCreate(MainActivity.java:32)
03-06 01:26:05.549: E/Database(27671):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java)
03-06 01:26:05.549: E/Database(27671):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java)
03-06 01:26:05.549: E/Database(27671):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java)
03-06 01:26:05.549: E/Database(27671):  at android.app.ActivityThread.access$1500(ActivityThread.java)
03-06 01:26:05.549: E/Database(27671):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java)
03-06 01:26:05.549: E/Database(27671):  at android.os.Handler.dispatchMessage(Handler.java)
03-06 01:26:05.549: E/Database(27671):  at android.os.Looper.loop(Looper.java)
03-06 01:26:05.549: E/Database(27671):  at android.app.ActivityThread.main(ActivityThread.java)
03-06 01:26:05.549: E/Database(27671):  at java.lang.reflect.Method.invokeNative(Native Method)
03-06 01:26:05.549: E/Database(27671):  at java.lang.reflect.Method.invoke(Method.java:507)
03-06 01:26:05.549: E/Database(27671):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
03-06 01:26:05.549: E/Database(27671):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
03-06 01:26:05.549: E/Database(27671):  at dalvik.system.NativeStart.main(Native Method)

Ответы [ 4 ]

1 голос
/ 05 марта 2012

Попробуйте это,

 public String[] getImgURL(){
    mydb = localContext.openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
    Cursor allrows  = mydb.rawQuery("SELECT ImgURL FROM "+  TABLE, null);
    String[] urlString = new String[allrows.getCount()-1];

    allrows.moveToFirst();

    for (int i = 1; i < allrows.getCount(); i++) {
        urlString[i] = allrows.getString(0);
        allrows.moveToNext();               
    }
    allrows.close();    
    mydb.close();
    return urlString;

}

0 голосов
/ 05 марта 2012

2 проблемы, здесь.

Сначала вы должны начать с перемещения курсора.В порядке moveToFirst или moveToNext.

Во-вторых, ваш индекс в массиве, а также размер массива неверны.

Правильно и актуально это сделать следующим образом:

mydb = localContext.openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
Cursor allrows  = mydb.rawQuery("SELECT ImgURL FROM "+  TABLE, null);
List<String> result = new ArrayList<String>();
while (allrows.moveToNext()) {
    result.add(allrows.getString(0));
}
allrows.close();    
mydb.close();
return allrows.toArray(new String[0]);
0 голосов
/ 05 марта 2012

Прежде чем начать работу с курсором, нужно позвонить allrows.moveToFirst.

0 голосов
/ 05 марта 2012

Если ваша ошибка - индекс вне границ, я думаю, вы создаете массив размером n -1, а затем помещаете n элементов внутрь. Должно быть

String[] urlString = new String[allrows.getCount()];

Таким образом, массив достаточно велик для количества элементов, которые вы помещаете внутрь. Если это ужасно неправильно, пожалуйста, опубликуйте трассировку стека, колоть в темноте не очень весело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...