我一直在關注使用SQLite對數據庫執行基本讀/寫操作的教程。Android SQLite數據庫處理程序執行錯誤
在AddWord.java(Activity)中的loaddata操作中,程序凍結。我不確定調試器哪一行失敗。該程序被分成三個類,如下所示:
DBHandler.Java:
package com.AH.memorisethai;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.ContentValues;
import android.content.Context;
public class DBHandler extends SQLiteOpenHelper {
private static final String KEY_ID = "id";
private static final String KEY_ENGLISH = "english";
private static final String KEY_THAI = "thai";
private static final String KEY_WORDTYPE = "wordtype";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "wordsmanager";
private static final String TABLE_WORDS = "words";
private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_WORDS
+ "(" + KEY_ID + " AUTOINCREMENT," + KEY_ENGLISH + " TEXT NOT NULL," + KEY_THAI + " TEXT NOT NULL" + ");";
public DBHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS" + TABLE_WORDS);
onCreate(db);
}
public void addEntry(Entry entry) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ENGLISH, entry.getEnglishword()); // Contact Name
values.put(KEY_THAI, entry.getThaiword()); // Contact Phone Number
// Inserting Row
db.insert(TABLE_WORDS, null, values);
db.close(); // Closing database connection
}
// Getting contacts Count
public int getContactsCount() {
String countQuery = "SELECT * FROM " + TABLE_WORDS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
// return count
return cursor.getCount();
}
}
Entry.Java:
package com.AH.memorisethai;
public class Entry {
private long id;
private String englishword;
private String thaiword;
public Entry(){
}
public Entry(int id, String englishword, String thaiword){
this.id = id;
this.englishword = englishword;
this.thaiword = thaiword;
}
// constructor
public Entry(String englishword, String thaiword){
this.englishword = englishword;
this.thaiword = thaiword;
}
public long getId(){
return id;
}
public String getEnglishword(){
return englishword;
}
public String getThaiword(){
return thaiword;
}
public void setId(long id){
this.id=id;
}
public void setEnglishword(String englishword){
this.englishword=englishword;
}
public void setThaiword(String thaiword){
this.thaiword=thaiword;
}
}
,活性內:
public int getContactsCount() {
String countQuery = "SELECT COUNT(*) FROM " + TABLE_WORDS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
int count = -1;
if (cursor.moveToFirst()) {
count = cursor.getInt(0);
}
cursor.close();
return count;
}
由於有目前沒有數據編輯應該返回0值 - 我認爲這是確保DBHandler c最簡單的測試敖德工作。
'loaddata'中的行是什麼?在該方法中設置一箇中斷點,看看它在退出之前有多遠。你的'KEY_ID'也應該是'autoincrement',並且你在'TABLE_CREATE'字符串的最後錯過了一個分號。 – BigT
Thanks @BigT - 我已經按照建議將'KEY_ID'更改爲'autoincrement',並在'TABLE_CREATE'字符串(修正的代碼)末尾添加了分號。它失敗的行是:'int a = db.getContactsCount();' – Andy