Tôi mới làm quen với khung công tác Android và tôi không thể vượt qua được cơ sở đầu tiên với SQLite.Tiếp tục nhận NullPointerExceptions khi cố gọi hàm getWritableDatabase()
Tôi đang cố gắng xây dựng một ứng dụng rất đơn giản có hộp tìm kiếm EditText, khi phím được nhấn thực hiện tìm kiếm% word% trên cơ sở dữ liệu SQLite cho văn bản được nhập trong hộp EditText và hiển thị các kết quả trong một ListView.
N.B. các mã dưới đây bao gồm gỡ lỗi và nhận xét mã, xin lỗi tôi đã không có vòng để làm sạch nó lên được nêu ra.
Các Activate là
public class sustainable_fish extends Activity {
private String keycodeToAscii(int arg2){
String retvar = "";
switch(arg2){
case KeyEvent.KEYCODE_A: retvar = "a";break;
case KeyEvent.KEYCODE_B: retvar = "b";break;
snipped, nhưng bạn sẽ có được ý tưởng.
case KeyEvent.KEYCODE_RIGHT_BRACKET: retvar = ")";break;
default: retvar = ""; break;
};
return retvar;
}
Context that = getApplicationContext();
fishDB dh = new fishDB(getApplicationContext());
private OnKeyListener search = new OnKeyListener() {
public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
@SuppressWarnings("unused")
Cursor cur = null;
String searchData;
EditText myEditText = (EditText) findViewById(R.id.fish_search);
CharSequence edit_text_value = myEditText.getText();
searchData = edit_text_value.toString();
searchData = searchData + keycodeToAscii(arg2.getKeyCode());
Log.d("onKey", "searchData = "+searchData);
/*
Commented out because as the database doesn't work, so theirs no point just yet searching.
cur = fish.search(searchData);
if (cur != null)
{
String[] displayFields = new String[] {cur.getString(2),
cur.getString(1)};
int[] displayViews = new int[] { R.id.fish_rank,
R.id.fish_name};
SimpleCursorAdapter adapter = new SimpleCursorAdapter(that,
R.layout.text_list, cur,
displayFields, displayViews);
ListView myList=(ListView)findViewById(android.R.id.list);
myList.setAdapter(adapter);
}
*/
return false;
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EditText searchBar = (EditText) findViewById(R.id.fish_search);
searchBar.setOnKeyListener(search);
}
}
Cơ sở dữ liệu SQLite được xử lý bởi fishDB
public class fishDB {
public static final String DATABASE_NAME = "fish.db3";
public static final int DATABASE_VERSION = 1;
private SQLiteDatabase database;
private Context myContext;
private static boolean booFirstrun = false;
fishDB(Context inContext){
myContext = inContext;
OpenHelper helper = new OpenHelper(myContext);
Log.w("fishDB", "Called OpenHelper");
// Here be the problem...
database = helper.getWritableDatabase();
}
public boolean firstRun(){
return booFirstrun;
}
private static class OpenHelper extends SQLiteOpenHelper {
private static final String CREATE_TABLE_FEEDS = "create table feeds (feed_id integer primary key autoincrement, "
+ "title text not null, url text not null);";
OpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Log.w("OpenHelper", "Called superconstructor");
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
Log.w("OpenHelper", "in onCreate");
booFirstrun = true;
Log.w("OpenHelper", "set booFirstrun");
db.beginTransaction();
Log.w("OpenHelper", "db.beginTransaction");
try {
// Create tables and test data
db.execSQL(CREATE_TABLE_FEEDS);
Log.w("OpenHelper", "execSQL");
db.setTransactionSuccessful();
Log.w("OpenHelper", "setTransactionSuccessful");
} catch (SQLException e) {
Log.e("Error creating tables and debug data", e.toString());
throw e;
} finally {
db.endTransaction();
}
} catch (Exception e) {
Log.e("OpenHelper", e.toString());
} finally {
Log.w("OpenHelper", "out of onCreate");
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w("OpenHelper", "Upgrading database, this will drop tables and recreate.");
onCreate(db);
}
}
}
Bây giờ mỗi khi "cơ sở dữ liệu = helper.getWritableDatabase();" được gọi là lỗi ứng dụng với NullPointerException. Tôi đã quản lý để theo dõi lỗi cho phương thức onCreate của OpenHelper và "db.beginTransaction();" hàng.
Tôi đang thiếu gì?
Cũng để tham khảo (nếu không có ai elses) 'db.endTransaction();' gây ra các onCreate để thất bại (và không âm thầm) gây ra một lỗi thời gian chạy trong 'OpenHelper helper = new OpenHelper (myContext);' và không viết bất kỳ bảng nào vào cơ sở dữ liệu (và do đó gây ra một SQLException bổ sung cho cuộc gọi tiếp theo). Hy vọng dừng lại này một số người khác lãng phí một ngày theo dõi nó xuống (hoặc chỉ cho tôi thời gian tới tôi viết một lớp cơ sở dữ liệu) –