2012-03-05 140 views
0

当我尝试从SQLite检索到数组时,出现错误。 我确定故障原因在for循环,误差在声明中从SQLite检索到数组有错误

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) 
+0

1),我们可以得到一个堆栈跟踪? 2)我通常使用do while循环遍历我的游标,但我想我可以在这里看到为什么。 – Pyrodante 2012-03-05 17:23:10

+0

发布错误堆栈跟踪。 – kosa 2012-03-05 17:23:15

回答

0

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

如果你的错误是一个索引出界,我的猜测是,你正在创建一个大小为n -1,然后一个数组把n个元素放在里面。它应该是

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

这样的阵列是你把里面的元素数量足够大。如果这是可悲的错误,请发布堆栈追踪,在黑暗中刺伤并不是很有趣。

+0

或者我应该从0开始,因为数组是0索引 – Pyrodante 2012-03-05 17:26:33

0

在您开始使用光标进行操作之前,您需要致电allrows.moveToFirst

1

试试这个,

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; 

}