1

我要做的是在具有多个表的android中创建一个sqlite db(我知道该怎么做)。我想做的是有一个类(活动)来创建每个表,打开和关闭数据库。然后为每个表创建一个类,用于我的插入、删除和选择语句。我很困惑如何做到这一点,因为我似乎找不到任何例子。

我目前拥有的是为每个表创建表、打开、插入和删除的类,但是一旦我的应用程序创建一个表,该应用程序将不会创建另一个表。如果我想做的是 A. 可能和 B. 好的做法,有人可以告诉我。

或者我应该把我所有的 SQL 放到一个类中?

4

3 回答 3

4

我不确定是否完全理解您的问题,但我建议您寻找ContentProvider。这是分离数据库创建和请求的最佳方式。

其次,您似乎无法创建数据库。我想你使用从SQLiteOpenHelper. 您可以分隔不同类中的表,但您只需调用扩展类onCreate的一次。SQLiteOpenHelper但是,您可以在此方法中为每个表调用来自不同类的其他静态方法。这是使数据库维护更容易的正确方法。如果我了解您的问题,我可以为您提供一些样品。

于 2012-08-16T21:37:56.223 回答
3

我刚刚解决了同样的问题。所有表必须同时创建,但通过单独的 SQL 语句。我所做的是保留我单独的 SQLOpenHelper 类,并使用一种方法创建一个新的“创建者”类,该方法执行所有 CREATE 语句,这些语句是 Helper 类中的静态字符串。然后每个助手类在其 onCreate() 中调用该方法。

于 2012-09-10T10:13:07.047 回答
0

有一些方法可能会带来良好的实践。Vogella 的博客对我来说总是一个很好的参考。看看这个方法。它由一个控制数据库的创建和更新的类和另一个作为 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);
}

}
于 2012-08-16T21:51:24.960 回答