ANDROID引起:java.lang.IllegalStateException:无法从CursorWindow

时间:2016-04-08 13:32:28

标签: java android list listview

我是Android开发新手,我在代码中找不到任何错误,但这总是显示在我的logcat中

我得到这个错误

04-08 21:22:52.448 27585-27585/app.fingervoiz.com.tamla E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      Process: app.fingervoiz.com.tamla, PID: 27585
                                                                      java.lang.RuntimeException: Unable to start activity ComponentInfo{app.fingervoiz.com.tamla/app.fingervoiz.com.tamla.FingerPrintList}: java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
                                                                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2534)
                                                                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2608)
                                                                          at android.app.ActivityThread.access$800(ActivityThread.java:178)
                                                                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                          at android.os.Looper.loop(Looper.java:194)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:5637)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                          at java.lang.reflect.Method.invoke(Method.java:372)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
                                                                       Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
                                                                          at android.database.CursorWindow.nativeGetLong(Native Method)
                                                                          at android.database.CursorWindow.getLong(CursorWindow.java:511)
                                                                          at android.database.CursorWindow.getInt(CursorWindow.java:578)
                                                                          at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
                                                                          at app.fingervoiz.com.tamla.TamlaDBHelper.getAllFingerPrint(TamlaDBHelper.java:129)
                                                                          at app.fingervoiz.com.tamla.FingerPrintList.onCreate(FingerPrintList.java:35)
                                                                          at android.app.Activity.performCreate(Activity.java:6092)
                                                                          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112)
                                                                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2481)
                                                                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2608) 
                                                                          at android.app.ActivityThread.access$800(ActivityThread.java:178) 
                                                                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470) 
                                                                          at android.os.Handler.dispatchMessage(Handler.java:111) 
                                                                          at android.os.Looper.loop(Looper.java:194) 
                                                                          at android.app.ActivityThread.main(ActivityThread.java:5637) 
                                                                          at java.lang.reflect.Method.invoke(Native Method) 
                                                                          at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) 
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 

这是我的代码

package app.fingervoiz.com.tamla;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by MEIHEART on 4/4/2016.
 */
public class TamlaDBHelper extends SQLiteOpenHelper{

//DataBase
private static final String DATABASE_NAME = "TamlaDB";
private static final String DATABASE_TABLE_1 = "Users";
private static final String DATABASE_TABLE_2 = "FingerPrintDataset";
private static final int DATABASE_VERSION = 1;

//Users Table
public static final String KEY_ROW_ID = "Users_Id";
public static final String KEY_ROW_NAME_1 = "firstName";
public static final String KEY_ROW_NAME_2 = "middleName";
public static final String KEY_ROW_NAME_3 = "lastName";
public static final String KEY_ROW_AGE = "user_age";
public static final String KEY_ROW_JOB_POSITION = "user_position";
public static final String KEY_ROW_WORK_STATION = "user_station";
public static final String KEY_ROW_EMAIL_ADDRESS = "user_email";
public static final String KEY_ROW_USERNAME = "usrName";
public static final String KEY_ROW_PASSWORD = "passWrd";
public static final String KEY_ROW_DEFAULT_PICTURE = "DPicture";

//FINGERPRINT Dataset Table
public static final String KEY_ROW_FPD_ID = "FPDs_Id"; //0
public static final String KEY_ROW_FPD_NAME = "FPDs_fullname"; //1
public static final String KEY_ROW_FPD_AGE = "FPDs_Age"; //2
public static final String KEY_ROW_FPD_GENDER = "FPDs_Gender"; //3
public static final String KEY_ROW_FPD_ADDRESS = "FPDs_Address"; //4
public static final String KEY_ROW_FPD_FINGERPRINT_1 = "FPDs_Fingerprint1"; //5
public static final String KEY_ROW_FPD_FINGERPRINT_2 = "FPDs_Fingerprint2"; //6
public static final String KEY_ROW_FPD_FINGERPRINT_3 = "FPDs_Fingerprint3"; //7
public static final String KEY_ROW_FPD_FINGERPRINT_4 = "FPDs_Fingerprint4"; //8
public static final String KEY_ROW_FPD_FINGERPRINT_5 = "FPDs_Fingerprint5"; //9
public static final String KEY_ROW_FPD_FINGERPRINT_6 = "FPDs_Fingerprint6"; //10
public static final String KEY_ROW_FPD_FINGERPRINT_7 = "FPDs_Fingerprint7"; //11
public static final String KEY_ROW_FPD_FINGERPRINT_8 = "FPDs_Fingerprint8"; //12
public static final String KEY_ROW_FPD_FINGERPRINT_9 = "FPDs_Fingerprint9"; //13
public static final String KEY_ROW_FPD_FINGERPRINT_10 = "FPDs_Fingerprint10"; //14
public static final String KEY_ROW_FPD_DEFAULT_PICTURE = "DPicture"; //15

public TamlaDBHelper(Context context){
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {

    db.execSQL("CREATE TABLE " + DATABASE_TABLE_1 + " (" + KEY_ROW_ID + " INTEGER PRIMARY KEY  AUTOINCREMENT NOT NULL, " + KEY_ROW_NAME_1 + " TEXT, " + KEY_ROW_NAME_2 + " TEXT, " + KEY_ROW_NAME_3 + " TEXT, " + KEY_ROW_AGE + " INTEGER, " + KEY_ROW_JOB_POSITION + " TEXT, " + KEY_ROW_WORK_STATION + " TEXT, " + KEY_ROW_EMAIL_ADDRESS + " TEXT, " + KEY_ROW_USERNAME + " TEXT, " + KEY_ROW_PASSWORD + " TEXT, " + KEY_ROW_DEFAULT_PICTURE + " BLOB);");

    db.execSQL("CREATE TABLE " + DATABASE_TABLE_2 + " (" + KEY_ROW_FPD_ID + " INTEGER PRIMARY KEY  AUTOINCREMENT NOT NULL, " + KEY_ROW_FPD_NAME + " TEXT, " + KEY_ROW_FPD_AGE + " INTEGER, " + KEY_ROW_FPD_GENDER + " TEXT, " + KEY_ROW_FPD_ADDRESS + " TEXT, " + KEY_ROW_FPD_FINGERPRINT_1 + " BLOB, " + KEY_ROW_FPD_FINGERPRINT_2 + " BLOB, " + KEY_ROW_FPD_FINGERPRINT_3 + " BLOB, " + KEY_ROW_FPD_FINGERPRINT_4 + " BLOB, " + KEY_ROW_FPD_FINGERPRINT_5 + " BLOB, " + KEY_ROW_FPD_FINGERPRINT_6 + " BLOB, " + KEY_ROW_FPD_FINGERPRINT_7 + " BLOB, " + KEY_ROW_FPD_FINGERPRINT_8 + " BLOB, " + KEY_ROW_FPD_FINGERPRINT_9 + " BLOB, " + KEY_ROW_FPD_FINGERPRINT_10 + " BLOB, " + KEY_ROW_FPD_DEFAULT_PICTURE + " BLOB);");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE_1 + " AND " + DATABASE_TABLE_2);
    onCreate(db);
}

public // Public Insert new User
void addFingerPrint(FingerPrint fingerPrint){
    SQLiteDatabase ourDatabase = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_ROW_FPD_NAME, fingerPrint.fulname);
    values.put(KEY_ROW_FPD_AGE, fingerPrint.age);
    values.put(KEY_ROW_FPD_GENDER, fingerPrint.gender);
    values.put(KEY_ROW_FPD_ADDRESS, fingerPrint.address);
    values.put(KEY_ROW_FPD_FINGERPRINT_1, fingerPrint.fp1);
    values.put(KEY_ROW_FPD_FINGERPRINT_2, fingerPrint.fp2);
    values.put(KEY_ROW_FPD_FINGERPRINT_3, fingerPrint.fp3);
    values.put(KEY_ROW_FPD_FINGERPRINT_4, fingerPrint.fp4);
    values.put(KEY_ROW_FPD_FINGERPRINT_5, fingerPrint.fp5);
    values.put(KEY_ROW_FPD_FINGERPRINT_6, fingerPrint.fp6);
    values.put(KEY_ROW_FPD_FINGERPRINT_7, fingerPrint.fp7);
    values.put(KEY_ROW_FPD_FINGERPRINT_8, fingerPrint.fp8);
    values.put(KEY_ROW_FPD_FINGERPRINT_9, fingerPrint.fp9);
    values.put(KEY_ROW_FPD_FINGERPRINT_10, fingerPrint.fp10);
    values.put(KEY_ROW_FPD_DEFAULT_PICTURE, fingerPrint._dp);

    ourDatabase.insert(DATABASE_TABLE_2, null, values);
    ourDatabase.close();
}


FingerPrint getFingerPrint(int id){

    SQLiteDatabase db = this.getWritableDatabase();

    String[] columns = new String[]{KEY_ROW_FPD_ID,KEY_ROW_FPD_NAME,KEY_ROW_FPD_AGE,KEY_ROW_FPD_GENDER,KEY_ROW_FPD_ADDRESS,KEY_ROW_FPD_FINGERPRINT_1,KEY_ROW_FPD_FINGERPRINT_2,KEY_ROW_FPD_FINGERPRINT_3,KEY_ROW_FPD_FINGERPRINT_4,KEY_ROW_FPD_FINGERPRINT_5,KEY_ROW_FPD_FINGERPRINT_6,KEY_ROW_FPD_FINGERPRINT_7,KEY_ROW_FPD_FINGERPRINT_8,KEY_ROW_FPD_FINGERPRINT_9,KEY_ROW_FPD_FINGERPRINT_10,KEY_ROW_FPD_DEFAULT_PICTURE};

    Cursor cursor = db.query(DATABASE_TABLE_2,columns,KEY_ROW_FPD_ID + "=?",new String[] { String.valueOf(id) },null,null,null,null);

    if (cursor != null)
        cursor.moveToFirst();

    FingerPrint fp = new FingerPrint(Integer.parseInt(cursor.getString(0)),cursor.getString(1),cursor.getString(2),cursor.getString(3),cursor.getString(4),cursor.getBlob(5),cursor.getBlob(6),cursor.getBlob(7),cursor.getBlob(8),cursor.getBlob(9),cursor.getBlob(10),cursor.getBlob(11),cursor.getBlob(12),cursor.getBlob(13),cursor.getBlob(14),cursor.getBlob(15));

    return fp;
}

// Getting All Contacts
public List<FingerPrint> getAllFingerPrint() {
    List<FingerPrint> contactList = new ArrayList<FingerPrint>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + DATABASE_TABLE_2;

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    for (cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
        FingerPrint fps = new FingerPrint();

        fps.setFpd_id(cursor.getInt(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_ID)));
        fps.setFulname(cursor.getString(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_NAME)));
        fps.setAge(cursor.getString(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_AGE)));
        fps.setGender(cursor.getString(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_GENDER)));
        fps.setAddress(cursor.getString(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_ADDRESS)));
        fps.setFp1(cursor.getBlob(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_FINGERPRINT_1)));
        fps.setFp2(cursor.getBlob(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_FINGERPRINT_2)));
        fps.setFp3(cursor.getBlob(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_FINGERPRINT_3)));
        fps.setFp4(cursor.getBlob(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_FINGERPRINT_4)));
        fps.setFp5(cursor.getBlob(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_FINGERPRINT_5)));
        fps.setFp6(cursor.getBlob(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_FINGERPRINT_6)));
        fps.setFp7(cursor.getBlob(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_FINGERPRINT_7)));
        fps.setFp8(cursor.getBlob(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_FINGERPRINT_8)));
        fps.setFp9(cursor.getBlob(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_FINGERPRINT_9)));
        fps.setFp10(cursor.getBlob(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_FINGERPRINT_10)));
        fps.set_dp(cursor.getBlob(cursor.getColumnIndexOrThrow(KEY_ROW_FPD_DEFAULT_PICTURE)));

        // Adding contact to list
        contactList.add(fps);
    }

    // close inserting data from database
    db.close();
    // return contact list
    return contactList;
}


// Deleting single contact
public void deleteFingerPrint(FingerPrint fingerPrint) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(DATABASE_TABLE_2, KEY_ROW_FPD_ID + " = ?",
            new String[]{String.valueOf(fingerPrint.get_id())});
    db.close();
}

// Updating single contact
public int updateFingerPrint(FingerPrint fingerPrint) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_ROW_FPD_NAME, fingerPrint.fulname);
    values.put(KEY_ROW_FPD_AGE, fingerPrint.age);
    values.put(KEY_ROW_FPD_GENDER, fingerPrint.gender);
    values.put(KEY_ROW_FPD_ADDRESS, fingerPrint.address);
    values.put(KEY_ROW_FPD_FINGERPRINT_1, fingerPrint.fp1);
    values.put(KEY_ROW_FPD_FINGERPRINT_2, fingerPrint.fp2);
    values.put(KEY_ROW_FPD_FINGERPRINT_3, fingerPrint.fp3);
    values.put(KEY_ROW_FPD_FINGERPRINT_4, fingerPrint.fp4);
    values.put(KEY_ROW_FPD_FINGERPRINT_5, fingerPrint.fp5);
    values.put(KEY_ROW_FPD_FINGERPRINT_6, fingerPrint.fp6);
    values.put(KEY_ROW_FPD_FINGERPRINT_7, fingerPrint.fp7);
    values.put(KEY_ROW_FPD_FINGERPRINT_8, fingerPrint.fp8);
    values.put(KEY_ROW_FPD_FINGERPRINT_9, fingerPrint.fp9);
    values.put(KEY_ROW_FPD_FINGERPRINT_10, fingerPrint.fp10);
    values.put(KEY_ROW_FPD_DEFAULT_PICTURE, fingerPrint._dp);

    // updating row
    return db.update(DATABASE_TABLE_2, values, KEY_ROW_FPD_ID + " = ?",
            new String[] { String.valueOf(fingerPrint.get_id()) });

}

// Getting contacts Count
public int getFingerPrintCount() {
    String countQuery = "SELECT  * FROM " + DATABASE_TABLE_2;
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.rawQuery(countQuery, null);
    int count = cursor.getCount();
    cursor.close();
    db.close();

    // return count
    return count;
}

}

请告诉我该怎么做,我在这里找不到任何答案,我已经尝试了很多方法来解决这个问题,但无法解决我的问题

感谢您的回复

1 个答案:

答案 0 :(得分:0)

这应该是您的代码的正确模式:

if(cursor != null){

    if(cursor.moveToFirst()){

        do{

            FingerPrint fps = new FingerPrint();


        fps.setFulname(cursor.getString(cursor.getColumnIndex(KEY_ROW_FPD_NAME)));
        fps.setAge(cursor.getInt(cursor.getColumnIndex(KEY_ROW_FPD_AGE)));
        fps.setGender(cursor.getString(cursor.getColumnIndex(KEY_ROW_FPD_GENDER)));
        fps.setAddress(cursor.getString(cursor.getColumnIndex(KEY_ROW_FPD_ADDRESS)));


        // Adding contact to list

        }while(cursor.moveToNext());
    }
}

P.S。 :如果不执行do-while,则表示光标为空。即您的表格为空或您的查询错误。

相关问题