1

我对 SQLite 有一个基本的困惑。我是否主要创建一个数据库实例?SQLite 是在后台线程上运行还是我必须将它放在 AsyncTask 中?(如果是这样,它应该与检索信息的异步​​任务相同吗?)

我在 MainActivity 的 AsyncTask 中解析 HTTP POST(我得到了需要监控其信息的车辆列表),我想将此 ArrayList 放入 SQLite 数据库。

我该如何实施?现在我有一个内部类扩展 MainActivity 中的 AsyncTask 和一个单独的 java 文件 DatabaseHandler 扩展 SQLiteOpenHelper。

public class DatabaseHandler extends SQLiteOpenHelper {

    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "vehicleManager";

    // Vehicle table name
    private static final String TABLE_VEHICLE = "vehicle";

............. code
}
4

3 回答 3

4

这就是我所做的,我创建了一个名为Databaseis 的类,static并让所有查询和所有数据库访问都通过它。如果我需要任何东西,我static会在该类中创建一个函数,该函数Database执行我需要的任何特定查询并返回一个Cursor然后我在代码中处理的函数。这样,如果我需要更改任何查询,我只需要更改一个位置,而不是在我的代码中跑来跑去尝试查找所有实例。

当我Database调用. 当然,所有调用都来自一个或第二个线程。SQLiteHelperDatabase.open(context)DatabaseAsyncTask

再说一次,我的个人设计,随意喜欢它或想出你自己的。

public final class Database {

    private static SQLHelper sqlhelper = null;
    private static SQLiteDatabase database = null;
    private static Context context = null;

    /** Prevents Instances */
    private Database(){};

    /**
     * Initiates the Database for access
     * @param context Application context
     */
    public static void initiate(Context context){
        if (sqlhelper == null)
            sqlhelper = new SQLHelper(context);

        if (Database.context == null)
            Database.context = context;
    }

    /**
     * Opens the database for reading
     * @throws SQLException if the database cannot be opened for reading
     */
    public static void openReadable() throws SQLException{
        if (database == null)
            database = sqlhelper.getReadableDatabase();
    }

    /**
     * Opens the database for writing
     * Defaults to Foreign Keys Constraint ON
     * @throws SQLException if the database cannot be opened for writing
     */
    public static void openWritable() throws SQLException{
        if ((database == null)? true : database.isReadOnly()) {
            openWritable(true);
        }
    }

    /**
     * Opens the database for writing
     * @param foreignKeys State of Foreign Keys Constraint, true = ON, false = OFF
     * @throws SQLException if the database cannot be opened for writing
     */
    public static void openWritable(boolean foreignKeys) throws SQLException{
        database = sqlhelper.getWritableDatabase();
        if (foreignKeys) {
            database.execSQL("PRAGMA foreign_keys = ON;");
        } else {
            database.execSQL("PRAGMA foreign_keys = OFF;");
        }
    }

    /**
     * Closes the database
     */
    public static void close(){
        if (database != null){
            database.close();
            database = null;
        }
        if (sqlhelper != null){
            sqlhelper.close();
            sqlhelper = null;
        }
    }

    /* Add functions here */
    public static Cursor selectNames(){
        openReadable();
        return database.rawQuery("SELECT * FROM names", null);
    }
}

final class SQLHelper extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "core.db";

    //private final Context context;

    SQLHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        //this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        // Create the tables
    }

    @Override
    public void onOpen(SQLiteDatabase db){
        super.onOpen(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

对于从 Activity 访问:

Database.initiate(getBaseContext());
Cursor c = Database.selectNames();

从片段:

Database.initiate(getActivity());
Cursor c = Database.selectNames();
于 2013-06-27T15:49:48.663 回答
2

如果从后台线程加载/保存到数据库会更好。
对 sqlite 的调用是同步的,这意味着它们可以阻塞您的 UI 线程。

您可以使用相同的 asynctask 或其他,这与您的应用程序的设计和您想要做的事情有关。重要的是不要从主线程运行查询。

于 2013-06-27T15:28:06.833 回答
1

AsyncTask正如@Plato 提到的,您可以在您询问的评论中保存/读取数据,例如如何在数据库中创建公共函数,class所以这里是:

public class DatabaseHandler extends SQLiteOpenHelper {

// All Static variables
// Database Version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "vehicleManager";

// Vehicle table name
private static final String TABLE_VEHICLE = "vehicle";

//public function to do stuff with the database
public static void saveVehicle(/*arguments*/){ //note you should somhow pass data you want to save.... you can create as many arguments as you need
     //Sql save logic with those arguments
}

当您需要保存数据时,您应该调用

DatabaseHandler.saveVehicle(/*arguments*/);

请注意,当您在类中实现该方法时,您可能需要一个返回值来判断数据是否真的保存了。

于 2013-06-27T15:46:05.813 回答