簡體   English   中英

Android SQLite數據庫跨活動共享

[英]Android SQLite database sharing across activities

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

我正在編寫一個與默認的Android sms應用程序分開發送自己消息的應用程序。 由於我的應用程序不是默認應用程序,因此無法寫入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();
}
}

現在,我的問題是我無法弄清楚在哪個活動中(甚至在一個活動中,甚至在一個活動中),或者如何創建dbHelper實例以使其在我的兩個活動中都可用。 我知道單例模式經常使用,並且ContentProvider方法是首選。 我不具備使用Android有限的知識准備使用ContentProviders的能力,因此我想探索單例方法。 誰能幫我完成這個過程?

我應該如何創建dbHelper的實例以使其在我的2個活動中可用

為了什么? 您可以為每個Activity創建一個新實例,因為它們使用的是相同的數據庫( outgoingMsgs.db )。

例如,如果您在Activity A中調用addRecord並在Activity B中使用dbHelper的另一個實例來調用getRecordCount ,則將選擇插入的數據。

您可以使用這樣的Abstract類。

公共抽象類DBAbstract擴展了Activity {private 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

我正在使用它,並且運行良好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM