Java 跨活动共享Android SQLite数据库

Java 跨活动共享Android SQLite数据库,java,android,database,sqlite,sqliteopenhelper,Java,Android,Database,Sqlite,Sqliteopenhelper,背景信息:Android是新的,而不是Java 我正在编写一个应用程序,它可以独立于默认的安卓sms应用程序发送自己的消息。因为我的应用程序不是默认的,所以我无法向Android的provider.sms.outbox写入数据,这是绝对正确的。为了解决这个问题,我正在创建一个SQLite数据库来存储我的应用程序的传出消息(在消息对象中)。我正在努力寻找一个关于如何创建一个SQLite数据库的好的、详细的解释/教程,该数据库可以在我的所有活动中使用。我只有两个活动;一个读取数据库,另一个读取/写入

背景信息:Android是新的,而不是Java

我正在编写一个应用程序,它可以独立于默认的安卓sms应用程序发送自己的消息。因为我的应用程序不是默认的,所以我无法向Android的provider.sms.outbox写入数据,这是绝对正确的。为了解决这个问题,我正在创建一个SQLite数据库来存储我的应用程序的传出消息(在消息对象中)。我正在努力寻找一个关于如何创建一个SQLite数据库的好的、详细的解释/教程,该数据库可以在我的所有活动中使用。我只有两个活动;一个读取数据库,另一个读取/写入数据库

我知道我需要创建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的实例以使其在我的2个活动中可用。我知道singleton模式经常被使用,ContentProvider方法是首选。我觉得我还没有准备好用我有限的Android知识来使用ContentProviders,所以我想探索singleton方法。有人能帮我完成这个过程吗

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

为什么?您只需为每个
活动
创建一个新实例,因为它们使用相同的数据库(
outgoingMsgs.db


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

您可以使用这样的抽象类

公共抽象类DBAbstract扩展活动{ 私人助理医生

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

我正在使用它,它工作得很好

谢谢。我不知道它是如何工作的……出于某种莫名其妙的原因。@CoffeeSaurus you welcome:)别担心,我第一次使用数据库时也遇到了很多困惑