8

提供された例を使用して、Sugar ORM を完全に使用できます。

私のユースケースでは、サーバーから SQLite DB をダウンロードします (そのための ETL ロードは数百万のレコードになるため、サーバー側で行う必要があります)。ダウンロードは、内部ストレージのカスタム パスに保存されます。

私の場合、POCO に基づく動的 DB 作成は必要ありません。

すべてのPOCOクラスフィールドがテーブル構造と一致する場合、カスタムパスを指す既存のSQLite DBでSugar ORMを使用することは可能ですか?

4

3 に答える 3

4
  1. まず第一に、私は Sugar が app クラスを拡張するという考えに満足していません。アプリの開始前に他のタスクを実行する必要がある場合はどうすればよいですか?! それでは、SugarApp を独自の AppClass で拡張し、appClass 名をマニフェストに登録しましょう。また、これは私が初めて信じたときにdbを初期化するのに適した場所です.

    public class MyAppStartClass extends SugarApp {
    
    @Override
    public final void onCreate() {
        init();
        super.onCreate();
    }
    
    private void init() {
        initDB();
    }
    
    private void initDB() {
        try {
            if (!doesDatabaseExist(this, consts.dbPath)) {
                Context context = getApplicationContext();
                SQLiteDatabase db = context.openOrCreateDatabase(consts.dbName, context.MODE_PRIVATE, null);
                db.close();
                InputStream dbInput = getApplicationContext().getAssets().open(consts.dbName);
                String outFileName = consts.dbPath;
                OutputStream dbOutput = new FileOutputStream(outFileName);
                try {
                    byte[] buffer = new byte[1024];
                    int length;
                    while ((length = dbInput.read(buffer)) > 0) {
                        dbOutput.write(buffer, 0, length);
                    }
                } finally {
                    dbOutput.flush();
                    dbOutput.close();
                    dbInput.close();
                }
            }
        } catch (Exception e) {
            e.toString();
        }
    }
    
    private boolean doesDatabaseExist(ContextWrapper context, String dbName)       {
        File dbFile = context.getDatabasePath(dbName);
        return dbFile.exists();
    }
    }
    
  2. マニフェスト: android:name="com.myPackageName.MyAppStartClass"

  3. 最初に空のデータベースを作成してください。そうしないと、FileOutputStream() および dbPath = /data/data/com.myPackageName/databases/myDb.db からエラーが発生します。

    SQLiteDatabase db = context.openOrCreateDatabase(consts.dbName, context.MODE_PRIVATE, null);

    デシベルを閉じます();

  4. 既存のデータベース スキーマに主キー列 ID があることを確認してください。そうそう!Sugar は、データを取得するための主キーとして ID のみを認識します。

  5. 既存のテーブルを使用したい場合は、SugarRecord を拡張するときに T を指定しないでください。また、Sugar をモジュールとして追加する必要があり、プロジェクトはそれに依存しています!

    public class Book extends SugarRecord {
      String title;
      String edition;
    
      public Book(){
      }
    
      public Book(String title, String edition){
        this.title = title;
        this.edition = edition;
      }
    }
    

6.既存のテーブルを使用する場合。Sugar は大文字の列名を検索することに注意してください。そのため、既存のテーブルの列名が小文字の場合、そこから既存のデータを取得することはできません!

7.それは私をしぶしぶ結論に導きます: データベースをゼロから開始し、それを使用してデータベースとテーブルを生成する場合、Sugar は素晴らしいです。ただし、データを含む既存のデータベースが既にある場合はそうではありません。

于 2015-05-24T03:13:13.193 に答える
3

私が見つけた解決策は、dbファイルをassetsフォルダー内に置くことでした。.csv ファイルを読み取って .db ファイルを作成する代わりに (適切なアクティビティを開始するとき)、まず .db ファイルが /data/data/file.db にあるかどうかを確認し、そうでない場合はコピーします。アセット フォルダーをそのパスに移動します。次のコードを使用すると、すべてを作成できます。

protected void copyDataBase() throws IOException {

        //Open your local db as the input stream
        InputStream myInput = getApplicationContext().getAssets().open("file.db");

        // Path to the just created empty db
        String outFileName = "/data/data/com.yourpackagename/databases/" + "file.db";

        //Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);

        //transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }

        //Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }
    protected boolean checkDataBase(){

        SQLiteDatabase checkDB = null;

        try{
            String myPath = "/data/data/com.yourpackage/databases/" + "file.db";
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

        }catch(SQLiteException e){

            //database does't exist yet.

        }

        if(checkDB != null){

            checkDB.close();

        }

        return checkDB != null ? true : false;
    }
于 2015-04-30T16:27:01.820 に答える
0

まだ試していません。ただし、データベース ファイルを /data/data//db_name.db の場所にコピーし、マニフェストの Sugar 構成で同じ db_name と db バージョンを使用できる場合は、それを取得する必要があります。

于 2014-06-17T17:47:28.777 に答える