2011-12-28 42 views
0

我正在構建一個嚴重依賴數據庫使用的應用程序。然而,我的模擬器行爲不規律,我無法找到什麼/什麼時候工作以及什麼時候不工作。如何在Android中正確使用數據庫?

下面您可以從我在網上找到的示例中直接獲取我的Adapter和Helper類。在這種形式下,它功能完美,它添加記錄,刪除它們,更新它們並將它們完美地顯示在列表中。

如果我嘗試更改ANYING(例如KEY_TITLE值),則應用程序崩潰,即使我創建了一個全新的模擬器。我完全被這難倒和任何幫助將受到極大的歡迎...

public class PirelliDBAdapter { 
private static final String DATABASE_NAME="data"; 
private static final String DATABASE_TABLE="reminders"; 
private static final int DATABASE_VERSION=1; 

public static final String KEY_TITLE="title"; 
public static final String KEY_BODY="body"; 

public static final String KEY_LOCATION = "location"; 
public static final String KEY_TYPE = "type"; 

public static final String KEY_DATE_TIME="date_time_value"; 
public static final String KEY_ROW_ID="_id"; 

private DatabaseHelper mDbHelper; 
private SQLiteDatabase db; 

private static final String DATABASE_CREATE = 
     "create table " + DATABASE_TABLE + " ("+ 
       KEY_ROW_ID+ " integer primary key autoincrement, "+ 
       KEY_TITLE+ " text not null, "+ 
       KEY_BODY+" text not null, "+ 
       KEY_DATE_TIME+ " text not null);"; 

private Context mContext; 

public PirelliDBAdapter(Context c){ 
    mContext=c; 
} 


// database open/close actions 
public PirelliDBAdapter open() throws android.database.SQLException{ 
    mDbHelper=new DatabaseHelper(mContext); 
    db=mDbHelper.getWritableDatabase(); 
    return this; 
} 

public void close(){ 
    mDbHelper.close(); 
} 

// database CRUD operation 
public long createReminder(String title, String body, String dateTime){ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_TITLE, title); 
    initialValues.put(KEY_BODY, body); 
    initialValues.put(KEY_DATE_TIME, dateTime); 

    return db.insert(DATABASE_TABLE, null, initialValues); 

} 

public boolean deleteReminder(long rowId){ 
    return db.delete(DATABASE_TABLE, KEY_ROW_ID+" = "+rowId,null) >0; 
} 

public Cursor fetchAllReminders(){ 
    return db.query(DATABASE_TABLE,new String [] {KEY_ROW_ID,KEY_TITLE,KEY_BODY,KEY_DATE_TIME}, null, null, null, null, null); 
} 

public Cursor fetchReminder(long rowId) throws SQLException{ 
    Cursor c = db.query(true, DATABASE_TABLE, new String []{KEY_ROW_ID,KEY_TITLE,KEY_BODY,KEY_DATE_TIME}, KEY_ROW_ID+" = "+rowId, null,null,null,null,null); 

    if(c!=null){ 
     c.moveToFirst(); 
    } 
    return c; 
} 

public boolean updateReminder(long rowId, String title, String body, String dateTime){ 
    ContentValues args = new ContentValues(); 
    args.put(KEY_TITLE, title); 
    args.put(KEY_BODY, body); 
    args.put(KEY_DATE_TIME, dateTime); 

    return db.update(DATABASE_TABLE, args, KEY_ROW_ID+" = "+rowId, null)>0; 
} 

private static class DatabaseHelper extends SQLiteOpenHelper{ 
    public DatabaseHelper(Context c){ 
     // create the current database 
     super(c,DATABASE_NAME,null,DATABASE_VERSION); 
    } 

    // overrides 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // create the database table 
     db.execSQL(DATABASE_CREATE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("drop table " + DATABASE_TABLE); 
     db.execSQL(DATABASE_CREATE); 

    } 
} 

這裏的嘗試另一個字段添加到數據庫中(AFTER創建一個全新的AVD)時,我的錯誤日誌:

12-28 22:02:11.806: E/SQLiteDatabase(421): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at pirelli.app.dbadapter.PirelliDBAdapter.open(PirelliDBAdapter.java:44) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at pirelli.app.AdminSpinnerScreen.onCreate(AdminSpinnerScreen.java:329) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at android.app.Activity.performCreate(Activity.java:4397) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at android.app.ActivityThread.access$500(ActivityThread.java:122) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at android.os.Handler.dispatchMessage(Handler.java:99) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at android.os.Looper.loop(Looper.java:132) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at android.app.ActivityThread.main(ActivityThread.java:4123) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at java.lang.reflect.Method.invokeNative(Native Method) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at java.lang.reflect.Method.invoke(Method.java:491) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    12-28 22:02:11.806: E/SQLiteDatabase(421): at dalvik.system.NativeStart.main(Native Method) 
+0

如果不,我們不能是任何飛機墜毀的日誌貼幫幫我。 – tacone 2011-12-28 17:54:16

+0

我已經在上面添加了錯誤日誌。 – Eugen 2011-12-28 23:49:26

+0

日誌看起來不完整,你錯過了一些開始的行。哪種類型的異常已被拋出?請從頭開始發佈完整的錯誤(以異常類型開頭) – tacone 2011-12-28 23:53:19

回答

0

我不得不更改適配器類,所以每當我做出改變數據庫,我用下面的註釋行:

public DatabaseHelper(Context c){ 
     // create the current database 
     super(c,DATABASE_NAME,null,DATABASE_VERSION); 
     SQLiteDatabase db = this.getWritableDatabase(); 
     try{//USE THESE WHEN CHANGING DB STRUCTURE 
      //db.execSQL("drop table if exists " + DATABASE_TABLE); 
      //db.execSQL(DATABASE_CREATE); 
     } catch(Exception E){ 
      Log.v("ERRRRRRROR", E.getMessage()); 
     } 
    } 
3

您是否正在安裝在模擬器上以前的安裝?數據庫只創建一次。之後,如果您更改了一個列名稱,它將無法工作。

如果您對數據庫結構進行了更改,則需要清除設備/仿真器中的應用程序以強制進行全新安裝或增加版本號。當然,如果更新版本號,則需要實施onUpgrade以銷燬數據庫並重新創建(或執行相應的遷移)。

+0

我爲每次更改創建新的AVD並且它仍然崩潰......如果存在事先存在的話,是否有任何方法可以完全刪除數據庫做任何事情也許......? – Eugen 2011-12-28 14:50:25

+0

您可以轉到應用程序的數據庫文件夾並手動刪除它,例如通過文件資源管理器。 – Yury 2011-12-28 15:12:16

+0

所以沒有辦法做到這一點編程...? – Eugen 2011-12-28 15:16:55

相關問題