13

SDカードにsqliteデータベースを作成しようとしています(ユーザーの内部ストレージを使い果たしたくありません)。私は OpenHelper パターンに精通しています:

public DatabaseFoo(Context context) {
    OpenHelper openHelper = new OpenHelper(context);
    mDb = openHelper.getWritableDatabase();
}

private static class OpenHelper extends SQLiteOpenHelper {
    public OpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    ...

したがって、SDカードで作成したい場合は、代わりに次を使用する必要があると思います:

public static SQLiteDatabase openOrCreateDatabase (String path, 
      SQLiteDatabase.CursorFactory factory);

しかし、「ファクトリ」引数は何であるべきで、どのファクトリを使用する必要がありますか?

また、アプリの使用中にユーザーがSDカードを取り外した場合にどうなるか少し心配です..

ありがとう

4

6 に答える 6

10

私はあなたがそこで説明したことをやろうとはしていませんが、おそらくそれを行うことができ、うまくいくかもしれません-いくつかの注意事項があります. まず、外部ストレージ (SD カード) は安全ではないため、他のアプリケーションやユーザーが読み書きできる可能性があります。第二に、あなたが指摘したように、マウントを解除するとDBは消えます。

これらの欠点があるため、内部ストレージ データベース (デフォルト) を使用することをお勧めします。これは小さく、外部データ (画像やファイルなど) へのポインターを含む可能性があります。それ自体が外部ストレージにある可能性があります。 (および、外部ストレージが利用できない場合のプレースホルダーまたはその他の処理があります)。

それでも、試してみたい場合は、独自のApplicationオブジェクトなどでContextのgetDatabasePathメソッドをオーバーライドしてから、それを通常のSQLiteOpenHelperに渡す方がよいでしょう。次に、カーソルファクトリについて心配する必要はありません(ソースが確認しているように、これはオプションです-代わりにそのルートに行きたい場合は null を渡すだけです)。

于 2011-01-26T15:44:25.650 に答える
10

SQLiteOpenHelper コンストラクターでこれを行います。

DatabaseHelper(Context context) {
        super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION);
    }

sdcard のアプリのフォルダー (/sdcard/Android/data/[your_package_name]/files) にデータベースが作成されます。そうすれば、データベースは Android によってアプリの一部として認識され、ユーザーがアプリをアンインストールすると自動的に削除されます。

私のアプリには大規模なデータベースがあり、ほとんどの場合、HTC Desire などの古い携帯電話の内部メモリには収まりません。それはsdcardでうまく動作し、ほとんどのアプリはとにかく「sdcardに移動」されるため、アプリ自体にアクセスできないため、データベースにアクセスできないことを心配する必要はありません.

于 2012-06-14T07:53:11.353 に答える
2

カーソルファクトリは、カスタムカーソル実装のインスタンスを返すために使用されます。通常はSQLiteCursorを使用するだけです。この場合、ファクトリ引数としてnullが渡されます。

于 2011-01-26T15:57:10.497 に答える
2

次に、独自のフラットなデータベースを作成します。ほとんどの人は内部メモリがほとんどなく、巨大なデータベースでそれを使い果たすのは面倒です。

また、「SD を取り外したらどうなるか」というシナリオについては、ユーザーがカードを取り外した場合、明らかに機能しません。明らかに。ベースと対話しようとしたときにエラーが発生しなかったことを確認してください。エラーが発生した場合は、問題が解決したことをユーザーに伝えてください。

于 2011-02-09T16:38:54.010 に答える
1
public DataBaseHelper(final Context context) {
    super(context, Environment.getExternalStorageDirectory()
    + File.separator+ MYDATABASE_NAME, null, MYDATABASE_VERSION);
}

Androidマニフェストにも許可を追加します

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2015-03-11T06:53:15.830 に答える
0

データベースを SD カードに保存しないことをお勧めします。カードの寿命が大幅に短くなります。これは、可能な書き込み数に (大きいが、まだ存在する) 制限があり、データベースにはかなりの数の書き込みが必要なためです。

于 2011-01-26T16:03:29.083 に答える