无法查询Android SQLite数据库

乔兰

我在LogCat中不断收到以下异常:

>05-07 11:26:19.276: E/AndroidRuntime(1608): FATAL EXCEPTION: main
05-07 11:26:19.276: E/AndroidRuntime(1608): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.db_003/com.db_003.MainActivityDb3}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
05-07 11:26:19.276: E/AndroidRuntime(1608): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
05-07 11:26:19.276: E/AndroidRuntime(1608): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.os.Looper.loop(Looper.java:137)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.app.ActivityThread.main(ActivityThread.java:4745)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at java.lang.reflect.Method.invoke(Method.java:511)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at dalvik.system.NativeStart.main(Native Method)
05-07 11:26:19.276: E/AndroidRuntime(1608): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.database.CursorWindow.nativeGetLong(Native Method)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.database.CursorWindow.getLong(CursorWindow.java:507)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.database.CursorWindow.getInt(CursorWindow.java:574)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:69)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at com.db_003.DB_Helper.cursorToList(DB_Helper.java:88)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at com.db_003.DB_Helper.queryCustom(DB_Helper.java:105)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at com.db_003.MainActivityDb3.onCreate(MainActivityDb3.java:29)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.app.Activity.performCreate(Activity.java:5008)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
05-07 11:26:19.276: E/AndroidRuntime(1608):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
05-07 11:26:19.276: E/AndroidRuntime(1608):     ... 11 more>

这是我的查询代码:

    Log.d("Select: ", "All Kerry towns");
    String table = DB_Helper.TABLE_TOWNS;
    String where = " WHERE " + DB_Helper.COUNTY + " = 'Kerry'";
    String strSQL = "SELECT " + DB_Helper.COUNTY + " FROM " + table + where + ";";
    Log.d("Select SQL Statement: ", strSQL);
    List<Town> towns = db.queryCustom( strSQL );
    for ( Town t : towns ) {
        Log.d("Kerry: ", t.toString() );
    }

这些是数据库信息字段:

public static final String DATABASE_NAME = "towns";
public static final int DATABASE_VERSION = 2;
public static String _ID = "_id";
public static final String TABLE_TOWNS = "towns";

public static final String TOWN = "town";   
static final String COUNTY = "county";
public static final String PROVINCE = "province";
public static final String COUNTRY = "country";

这是DB_Helper.java中的查询方法:

public List<Town> queryCustom(String strSQL) {
    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor =  db.rawQuery(strSQL, null);
    List<Town> townList = cursorToList( cursor );
    db.close();
    return townList;        
}

和cursorToList方法:

private List<Town> cursorToList(Cursor cursor) {
    List<Town> townList = new ArrayList<Town>();
    if ( cursor.moveToFirst() ) {
        do {
            // get the field details from the cursor                
            int id = cursor.getInt( cursor.getColumnIndex(_ID) );
            String town = cursor.getString( cursor.getColumnIndex( TOWN) );
            String county = cursor.getString( cursor.getColumnIndex( COUNTY) );
            String province = cursor.getString( cursor.getColumnIndex( PROVINCE) );
            String country = cursor.getString( cursor.getColumnIndex( COUNTRY) );
            // create a new empty instance of
            // Country and add it to the list
            townList.add( new Town(id, town, county, province, country) );
        } while ( cursor.moveToNext() );
    }
    return townList;
}

选择所有列时,此方法工作正常,但我无法选择特定的列。希望能有所帮助。

海浪

cursorToList()假设所有5列都在中Cursor当您仅查询一列时,您将获得-1作为缺少列的列索引,并将该索引与一起使用get...()会给您带来例外。

要么总是查询所有列,要么在尝试使用索引之前检查索引是否为-1。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Expo SQLite 无法查询数据库

来自分类Dev

查询“脱节”的Android sqlite数据库

来自分类Dev

无法打开数据库android Sqlite

来自分类Dev

Android 无法创建 SQLite 数据库

来自分类Dev

从sqlite数据库android写入数据

来自分类Dev

ios Sqlite数据库-选择查询

来自分类Dev

查询到sqlite数据库出错

来自分类Dev

SQLite数据库查询多个表

来自分类Dev

在Thunderbird中查询SQLite数据库

来自分类Dev

SQLite 数据库 - 更新查询

来自分类Dev

SQLITE 嵌套数据库查询

来自分类Dev

无法使用 SQLite 数据库查询填充 ListView

来自分类Dev

无法将数据插入android studio sqlite数据库

来自分类Dev

无法在Android SQlite数据库中插入数据

来自分类Dev

无法在android中的Sqlite数据库中保存数据?

来自分类Dev

Android - 我无法从 SQLite 数据库更新数据

来自分类Dev

无法从Spark访问sqlite数据库

来自分类Dev

无法删除sqlite数据库

来自分类Dev

数据库sqlite无法运行,

来自分类Dev

sqlite无法打开数据库

来自分类Dev

无法创建本地数据库SQLite

来自分类Dev

SQLite数据库无法正常工作

来自分类Dev

PDO SQLite无法打开数据库

来自分类Dev

无法从SQLite数据库读取

来自分类Dev

SQLIte数据库无法删除条目

来自分类Dev

Laravel Sqlite 数据库无法连接

来自分类Dev

在 android SQLite 数据库中运行查询

来自分类Dev

Android SQLite MultiTable数据库开发

来自分类Dev

加密sqlite数据库Android: