0

我有这样的DatabaseHandler课:

public class DatabaseHandler extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 1;

private static final String DATABASE_NAME = "CaseDatabase";
private static final String TABLE_CASES = "cases";
private static final String KEY_ID = "id";
private static final String DATE = "date";
private static final String RIGHTFINGER = "rightFinger";
private static final String LEFTFINGER = "leftFinger";


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

@Override
public void onCreate(SQLiteDatabase db) {

      String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CASES + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + DATE + " TEXT,"
                + RIGHTFINGER + " BLOB," + LEFTFINGER +" BLOB" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

      db.execSQL("DROP TABLE IF EXISTS " + TABLE_CASES);

        // Create tables again
        onCreate(db);

}

public void addContact(Case c) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_ID, c.getCaseNumber()); // PCN
    values.put(DATE, c.getDate()); // Date

    ByteArrayOutputStream out1 = new ByteArrayOutputStream();
    c.getLeftIndexFinger().compress(Bitmap.CompressFormat.PNG, 100, out1); 

    ByteArrayOutputStream out2 = new ByteArrayOutputStream();
    c.getRightIndexFinger().compress(Bitmap.CompressFormat.PNG, 100, out2); 

    values.put(LEFTFINGER, out1.toByteArray()); // LFINGER
    values.put("RIGHTFINGER", out2.toByteArray()); //RFINGER



    // Inserting Row
    db.insert(TABLE_CASES, null, values);
    db.close(); // Closing database connection
}

public ArrayList<Case> getAllContacts() {
    ArrayList<Case> caseList = new ArrayList<Case>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_CASES;

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

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Case c = new Case();

            c.setCaseNumber(cursor.getString(0));
            c.setDate(cursor.getString(1));

            byte[] blob1 = cursor.getBlob(cursor.getColumnIndexOrThrow("2"));
            Bitmap bmp1 = BitmapFactory.decodeByteArray(blob1, 0,blob1.length);

            c.setLeftIndexFinger(bmp1);

            byte[] blob2 = cursor.getBlob(cursor.getColumnIndexOrThrow("3"));
            Bitmap bmp2 = BitmapFactory.decodeByteArray(blob1, 0,blob2.length);
            c.setRightIndexFinger(bmp2); 


            // Adding contact to list
            caseList.add(c);
        } while (cursor.moveToNext());
    }

    // return contact list
    return caseList;
}

}

add方法完美运行,但是当我尝试调用该getAllContacts方法时,如下所示:

public ArrayList<Case> getFromDatabase() {

    ArrayList<Case> c = db.getAllContacts();    
    return c; 
}

list = getFromDatabase();

应用程序崩溃,LogCat 打印出以下内容:

07-30 12:07:56.570: E/AndroidRuntime(13040): FATAL EXCEPTION: main

我尝试从数据库中获取记录的方法是在另一个活动中,而不是该add方法

这是我的getAllContacts方法:

public ArrayList<Case> getAllContacts() {
    ArrayList<Case> caseList = new ArrayList<Case>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_CASES;

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

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Case c = new Case();

            c.setCaseNumber(cursor.getString(0));
            c.setDate(cursor.getString(1));

            byte[] blob1 = cursor.getBlob(cursor.getColumnIndexOrThrow("2"));
            Bitmap bmp1 = BitmapFactory.decodeByteArray(blob1, 0,blob1.length);

            c.setLeftIndexFinger(bmp1);

            byte[] blob2 = cursor.getBlob(cursor.getColumnIndexOrThrow("3"));
            Bitmap bmp2 = BitmapFactory.decodeByteArray(blob1, 0,blob2.length);
            c.setRightIndexFinger(bmp2); 


            // Adding contact to list
            caseList.add(c);
        } while (cursor.moveToNext());
    }

    // return contact list
    return caseList;
}

日志信息:

  E/AndroidRuntime(15058): FATAL EXCEPTION: main
E/AndroidRuntime(15058): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.package.hello/com.package.hello.History}: java.lang.NullPointerException
E/AndroidRuntime(15058):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
E/AndroidRuntime(15058):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
E/AndroidRuntime(15058):    at android.app.ActivityThread.access$600(ActivityThread.java:128)
E/AndroidRuntime(15058):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
E/AndroidRuntime(15058):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(15058):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(15058):    at android.app.ActivityThread.main(ActivityThread.java:4517)
E/AndroidRuntime(15058):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(15058):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(15058):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
E/AndroidRuntime(15058):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
E/AndroidRuntime(15058):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(15058): Caused by: java.lang.NullPointerException
E/AndroidRuntime(15058):    at com.package.hello.History.getFromDatabase(History.java:153)
E/AndroidRuntime(15058):    at com.package.hello.History.onCreate(History.java:49)
E/AndroidRuntime(15058):    at android.app.Activity.performCreate(Activity.java:4533)
E/AndroidRuntime(15058):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
E/AndroidRuntime(15058):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)

History.java 中的第 153 行是这样的:

    ArrayList<Case> c = db.getAllContacts();   

在历史类中,该db对象尚未被声明为它,因为该类继承自该add方法所在的类。

编辑 3

我的历史课

public class History extends SuperClass {

ListView lv;
ArrayList<Case> list; 
ArrayList<Case> tempCaseList; 
TextView header;
EditText ed; 
String[] tempList; 
int textLength; 
TextView error;
Boolean[] isPresent;
DatabaseHandler db;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.setTabBar(R.layout.history); 

    lv = (ListView)findViewById(R.id.listOfCases); 
    list = new ArrayList<Case>(); 

    list = getFromDatabase();

    lv.setAdapter(new CustomAdapter(this, list)); 
    lv.setTextFilterEnabled(true);

    header = (TextView)findViewById(R.id.textView1);
    header.setText("History");
    error = (TextView)findViewById(R.id.error);

    // db = new DatabaseHandler(this);


    tempList = getCaseNumberToTempList(list);
    tempCaseList = createTempList(list); 



    ed = (EditText)findViewById(R.id.editText1);

    ed.addTextChangedListener(new TextWatcher() {



        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,
                int arg2, int arg3) {


        }

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {

            textLength = ed.getText().length();
            list.clear(); 
            isPresent = initIsPresentArray(); 

            for (int i = 0; i < tempList.length; i++) {
                for (int j = 0; j < (tempList[i].length()-(textLength-1)); j++) {
                    if (textLength <= tempList[i].length()) {
                        if(isPresent[i] == false){
                            if (ed.getText().toString().equalsIgnoreCase((String) tempList[i].subSequence(j,(j+textLength)))) {
                                list.add(tempCaseList.get(i));
                                isPresent[i] = true;
                        }
                    }
                }
            }
            if(list.size() == 0) {
                error.setText("Not Found"); 
            }
            else {
                error.setText(""); 
            }

            lv.setAdapter(new CustomAdapter(History.this, list)); 
        }
        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub

        }
    });


}

public Boolean[] initIsPresentArray() {
    Boolean[] isPresent = new Boolean[tempCaseList.size()];
    for(int i = 0; i < isPresent.length; i++) {
        isPresent[i] = false; 
    }
    return isPresent; 
}

public ArrayList<Case> createTempList(ArrayList<Case> listOfCases) {

    ArrayList<Case> temporaryList = new ArrayList<Case>(); 

    for(Case c : listOfCases) {
        temporaryList.add(c);
    }

    return temporaryList;
}

public String[] getCaseNumberToTempList(ArrayList<Case> caseList) {

    String[] objectCaseNumber = new String[caseList.size()];  

    for(int i = 0; i < caseList.size(); i++) {
        objectCaseNumber[i] = caseList.get(i).getCaseNumber();  
    }

    return objectCaseNumber;

}


public ArrayList<Case> getFromDatabase() {

    ArrayList<Case> c = db.getAllContacts();    
    return c; 
}

 }

最终编辑

发现我的错误..我只是忘记了初始化。调用使用该db对象的方法之前的对象。但是我遇到了另一个错误,这不是这个线程的主题,所以如果我再次卡住,我会发布一个新线程。谢谢。

4

1 回答 1

2

在您进行编辑后,代码在此处崩溃:

ArrayList<Case> c = db.getAllContacts();   

这里唯一可能导致 a 的NullPointerExceptiondb它本身null。您需要检查db此时是否已正确初始化。


我之前的回答仍然有效:

如果没有看到完整的 stracktrace 就很难确定,但这看起来肯定是错误的:

byte[] blob1 = cursor.getBlob(cursor.getColumnIndexOrThrow("2"));

这正在寻找一个名为 的列"2",该列不存在。由于您已经知道要查找的 blob 的列索引,因此您的意思可能是:

byte[] blob1 = cursor.getBlob(2);

或者,如果您确实想按列名查找索引:

byte[] blob1 = cursor.getBlob(cursor.getColumnIndexOrThrow("rightFinger"));
于 2012-07-30T10:28:30.567 回答