2011-12-28 44 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

相关问题