2011-12-28 16 views
0

私は、データベースの使用に大きく依存するアプリケーションを構築しています。しかし、私のエミュレータは不安定な動作をしており、いつ、何時、何時、何時、何時にパターンを見つけることができません。Androidでデータベースを正しく使用する方法は?

以下は、Webで見つかったサンプルのアダプタとヘルパーのクラスです。このフォームでは、完全に機能し、レコードを追加し、削除し、更新し、リストに完全に表示します。

全く新しいエミュレータを作成しても、何か(たとえば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); 

    } 
} 

(まったく新しい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

+0

上記のエラーログを追加しました。 – Eugen

+0

ログが不完全なように見えますが、最初はいくつかの行がありません。どのタイプの例外がスローされましたか?最初から完全なエラーを投稿してください(例外のタイプから始まります) – tacone

答えて

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

+0

アプリのデータベースフォルダに移動して、ファイルエクスプローラなどで手動で削除することができます。 – Yury

+0

これをプログラムで行う方法はありません...? – Eugen

関連する問題