背景信息: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();
}
}
现在,我的问题是我无法弄清楚在哪里(在Activity中,甚至在Activity中)或者我应该如何创建我的dbHelper实例以使其在我的2个活动中可用。我知道经常使用单例模式,首选ContentProvider方法。我不觉得我已经准备好使用我非常有限的Android知识使用ContentProviders,所以我想探索单例方法。谁能帮助我完成这个过程?
答案 0 :(得分:1)
我应该如何创建dbHelper的实例以使其可用 我的两项活动
为了什么?您可以为每个Activity
创建一个新实例,因为它们使用的是同一个数据库(outgoingMsgs.db
)。
例如,如果您在addRecord
A中致电Activity
并使用dbHelper
B中的Activity
的不同实例来呼叫getRecordCount
,则会插入数据将被选中。
答案 1 :(得分:0)
您可以使用这样的Abstract类。
公共抽象类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
我正在使用它并且它运行良好