我要做的是在android中创建一个具有多个表的sqlite数据库(我知道如何做到这一点)。我想要做的是有一个类(Activity)创建每个表,打开和关闭数据库。然后为每个表创建一个类,用于我的insert,delete和select语句。我很困惑如何做到这一点,因为我似乎找不到任何例子。
我目前拥有的是每个创建表,打开,插入和删除的表的类,但是一旦我的应用创建了一个表,应用就不会创建另一个表。有人可以告诉我,如果我想要做的是A.可能和B.良好实践。
或者我应该将所有SQL放入一个类中?
答案 0 :(得分:4)
我不确定完全理解你的问题,但我建议你去寻找ContentProvider。这是分离数据库创建和请求的最佳方式。
其次,您似乎无法创建数据库。我想你使用的是从SQLiteOpenHelper
延伸的类。您可以将不同类中的表分开,但只需要调用onCreate
扩展类的SQLiteOpenHelper
。但是,您可以在此方法中为每个表调用来自不同类的其他静态方法。这是使数据库维护更容易的正确方法。
如果我理解你的问题,我可以提供一些样品。
答案 1 :(得分:3)
我刚刚解决了同样的问题。必须同时创建所有表,但必须通过单独的SQL语句创建。我所做的是保留单独的SQLOpenHelper类,并使用一个方法创建一个新的'Creator'类,该方法执行所有CREATE语句,这些语句是Helper类中的静态字符串。然后每个辅助类在其onCreate()中调用该方法。
答案 2 :(得分:0)
有些方法可能会带来良好的实践。 Vogella的博客总是很好的参考我。看看this approach。它由一个控制数据库创建和更新的类组成,另一个作为DAO组成,以便为某种类型的对象提出必要的请求。
我个人总是在Singleton类中一起使用两者的组合,这非常适合维护和控制实例的整个生命周期(在我的例子中是SQLiteDatabase),它允许您完成执行所需的任务无需打开,关闭或丢失对数据库对象的引用。同一个类继承自SQLiteOpenHelper以管理数据库的创建和更新。
一般结构可能如下所示:
package your.package;
import java.io.File;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBManager extends SQLiteOpenHelper {
private static DBManager sInstance;
private static SQLiteDatabase db;
private final String LOG_TAG = this.getClass().getSimpleName();
private static final String DB_NAME = "DBName";
private static final int DB_VERSION = 1;
public static synchronized DBManager getInstance(Context _c) {
if (sInstance == null) {
sInstance = new DBManager(_c);
}
return sInstance;
}
private DBManager(Context _c) {
super(_c, DB_NAME, null, DB_VERSION);
}
public void deleteTable(String table) {
if (db == null || !db.isOpen()) {
db = getWritableDatabase();
}
db.execSQL("DROP TABLE " + table);
db.close();
}
public void reset() {
File dbFile = new File(getReadableDatabase().getPath());
dbFile.delete();
sInstance = null;
db.close();
}
public static void closeDB() {
if (sInstance != null && db != null && db.isOpen()) {
db.close();
}
}
public long insertContent(String table, ContentValues cv) {
if (db == null || !db.isOpen()) {
db = getWritableDatabase();
}
return db.insert(table, null, cv);
}
public void updateContent(String table, ContentValues cv, String whereClause, String[] whereArgs) {
if (db == null || !db.isOpen()) {
db = getWritableDatabase();
}
db.update(table, cv, whereClause, whereArgs);
}
@Override
public void onCreate(SQLiteDatabase db) {
if (db == null || !db.isOpen()) {
db = getWritableDatabase();
}
db.execSQL("your query");
}
@Override
public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
Log.i(LOG_TAG, "onUpgrade old: " + oldVersion + " new: " + newVersion);
}
}