1

SQLite について根本的な混乱があります。メインでデータベース インスタンスを作成しますか? SQLite はバックグラウンド スレッドで実行されますか? それとも AsyncTask に入れる必要がありますか? (そうであれば、情報を取得するのと同じ 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

これが私が行うことです。Databasewhich isというクラスを作成し、staticすべてのクエリとすべてのデータベースアクセスがそれを通過するようにします。何か必要な場合は、staticそのクラス内に関数を作成します。この関数は、必要な特定のクエリを実行し、コードで処理する をDatabase返します。Cursorこのように、クエリを変更する必要がある場合、1 つの場所を変更するだけで済み、すべてのインスタンスを見つけようとしてコードを実行する必要がありません。

を呼び出すと、クラスはその内部にクラスDatabaseのインスタンスを作成します。もちろん、すべての呼び出しは1 つまたは 2 番目のスレッドからのものです。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) {

    }
}

アクティビティからのアクセスの場合:

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

そしてフラグメントから:

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

バックラウンド スレッドからデータベースにロード/保存する方がよいでしょう。
sqlite への呼び出しは同期的です。つまり、UI スレッドをブロックする可能性があります。

同じ asynctask または別の 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 に答える