【问题标题】:Android SQLite database sharing across activitiesAndroid SQLite 数据库跨活动共享
【发布时间】:2014-11-11 20:37:29
【问题描述】:

背景信息:Android 新手,Java 新手。

我正在编写一个应用程序,它与默认的 Android 短信应用程序分开发送自己的消息。由于我的应用程序不是默认应用程序,因此我无法写入 Android 的 provider.sms.outbox,这绝对没问题。为了解决这个问题,我正在创建一个 SQLite 数据库来存储我的应用程序的传出消息(在消息对象中)。我正在努力寻找关于如何创建可用于我所有活动的 SQLite 数据库的良好、详细的解释/教程。我只有 2 项活动;一种读取数据库,另一种读取/写入数据库。

我知道我需要创建 SQLiteOpenHelper 的子类,并且我有:

public class dbHelper extends SQLiteOpenHelper {
//Database Info
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "outgoingMsgs.db";
public static final String TABLE_MESSAGES = "messages";
//Table Info
public static final String COLUMN_ID = "id";
public static final String COLUMN_SEND_TO_NAME = "send_to_name";
public static final String COLUMN_SEND_TO_NUM = "send_to_num";
public static final String COLUMN_BODY = "msg_body";

public dbHelper(Context context){
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

//table creation...
@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_MESSAGES_TABLE = "CREATE TABLE " + TABLE_MESSAGES +
            "(" + COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_SEND_TO_NAME + " TEXT," +
            COLUMN_SEND_TO_NUM + " TEXT," + COLUMN_BODY + " TEXT" + ")";
    db.execSQL(CREATE_MESSAGES_TABLE);
}
//database version upgrade... destroys old and recreates
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_MESSAGES);
    onCreate(db);
}

//adds single record
public void addRecord(myMessage msg){
    SQLiteDatabase dbase = this.getWritableDatabase();
    ContentValues vals = new ContentValues();
    //fill vals with appropriate content
    vals.put(COLUMN_SEND_TO_NAME, msg.get_name());
    vals.put(COLUMN_SEND_TO_NUM, msg.get_number());
    vals.put(COLUMN_BODY, msg.getBody());
    //insert
    dbase.insert(TABLE_MESSAGES, null, vals);
    dbase.close();
}

public int getRecordCount(){
    String countQuery = "SELECT * FROM " + TABLE_MESSAGES;
    SQLiteDatabase dbase = this.getReadableDatabase();
    Cursor cursor = dbase.rawQuery(countQuery, null);
    cursor.close();
    return cursor.getCount();
}

//deletes a single record
public void deleteRecord(myMessage msg){
    SQLiteDatabase dbase = this.getWritableDatabase();
    dbase.delete(TABLE_MESSAGES, COLUMN_ID + " = ?",
            new String[] { String.valueOf(msg.get_id()) });
    dbase.close();
}
}

现在,我的问题是我不知道在哪里(在哪个 Activity 甚至在一个 Activity 中)或者我应该如何创建我的 dbHelper 实例以使其在我的 2 个活动中可用。我知道单例模式经常使用,并且首选 ContentProvider 方法。我不觉得我已经准备好使用我非常有限的Android知识的ContentProviders,所以我想探索singleton方法。谁能帮我完成这个过程?

【问题讨论】:

    标签: java android database sqlite sqliteopenhelper


    【解决方案1】:

    我应该如何创建我的 dbHelper 实例以使其可用 在我的 2 项活动中

    为了什么?您可以为每个 Activity 创建一个新实例,因为它们使用相同的数据库 (outgoingMsgs.db)。

    例如,如果你在ActivityA中调用addRecord,并在ActivityB中使用dbHelper的不同实例调用getRecordCount,则插入的数据将被选中。

    【讨论】:

    • 谢谢。我没有意识到它是如何工作的......出于某种莫名其妙的原因。
    • @CoffeeSaurus 欢迎您 :) 别担心,我第一次使用数据库时也很困惑
    【解决方案2】:

    你可以像这样使用抽象类。

    公共抽象类 DBAbstract 扩展 Activity { 私有 DBHelper mDBHelper;

    protected DBHelper getHelper(){
        if(mDBHelper == null){
            mDBHelper = OpenHelperManager.getHelper(this, DBHelper.class);
        }
        return mDBHelper;
    }
    
    protected int getDBVersion(){
        return mDBHelper.getDatabaseVersion();
    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
        if(mDBHelper != null){
            OpenHelperManager.releaseHelper();
            mDBHelper = null;
        }
    }
    

    并在您的新活动中使用它。

    public class YourActivity extends DBAbstract
    

    我正在使用它,它运行良好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多