2014-02-12 55 views
1

我一直在關注使用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最簡單的測試敖德工作。

+0

'loaddata'中的行是什麼?在該方法中設置一箇中斷點,看看它在退出之前有多遠。你的'KEY_ID'也應該是'autoincrement',並且你在'TABLE_CREATE'字符串的最後錯過了一個分號。 – BigT

+0

Thanks @BigT - 我已經按照建議將'KEY_ID'更改爲'autoincrement',並在'TABLE_CREATE'字符串(修正的代碼)末尾添加了分號。它失敗的行是:'int a = db.getContactsCount();' – Andy

回答

4

這裏有多個問題。

首先,SQL語法問題在這裏:

private static final String TABLE_CREATE = "CREATE TABLE" + TABLE_WORDS 
           + "(" + KEY_ID + "AUTOINCREMENT," + KEY_ENGLISH + "TEXT NOT NULL," + KEY_THAI + "TEXT NOT NULL" + ");"; 

您需要添加關鍵字和標識符之間的空白,就像這樣:

private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_WORDS 
           + "(" + KEY_ID + " AUTOINCREMENT," + KEY_ENGLISH + " TEXT NOT NULL," + KEY_THAI + " TEXT NOT NULL" + ");"; 

AUTOINCREMENT要求它INTEGER PRIMARY KEY AUTOINCREMENT。最後的分號;是可選的。空白也需要

DROP TABLE

db.execSQL("DROP TABLE IF EXISTS " + TABLE_WORDS) 
//       here^

getContactsCount()

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(); 
} 

...你所訪問的光標它關閉之後。此外,由於你在數只intetested,你可以問數據庫引擎計算行數爲您提供:

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; 
} 

在DB幫手onCreate()編輯數據庫架構後,確保數據庫重建。最簡單的方法就是卸載應用程序,以便刪除包含數據庫文件的數據文件。

+0

非常感謝 - 我已經做了補充,它現在完美。除此之外,由於我是Android(和SQLite)中的數據庫的新手,這是一種在代碼行方面設置Android內SQLite數據庫的非常有效的方法嗎? – Andy