67

最近、Android アプリをコーディングしました。いくつかの簡単なカウンター間隔でバスケットボールの試合のスコアを記録できるシンプルなアプリです。保存機能を追加してほしいという要望が寄せられているので、スコアを保存してから再度読み込むことができます。現在、アプリを停止するとデータが失われます。だから私が疑問に思っていたのは、アプリにラベル (スコア) を保存させ、それを再度読み込むために追加する必要があることです。申し訳ありませんが、私はこのことについてあまり知りません。

4

12 に答える 12

89

選択肢は 2 つあります。どちらを選択するかはあなたにお任せします。

  1. 共有設定

    これは Android 固有のフレームワークであり、キー値フレームワークにプリミティブ値 (厳密にはプリミティブではありませんがint、 、boolean,など) を格納できます。これは、値に「homeScore」などの名前を付けて、値をこのキーに保存することを意味します。StringString

    SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putInt("homeScore", YOUR_HOME_SCORE);
    
    // Apply the edits!
    editor.apply();
    
    // Get from the SharedPreferences
    SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0);
    int homeScore = settings.getInt("homeScore", 0);
    
  2. 内部記憶装置

    私の意見では、これはあなたが探しているものです。必要なものは何でもファイルに保存できるため、柔軟性が向上します。ただし、すべてがバイトとして格納されるため、プロセスが複雑になる可能性があります。つまり、読み取りプロセスと書き込みプロセスを連携させるように注意する必要があります。

    int homeScore;
    byte[] homeScoreBytes;
    
    homeScoreBytes[0] = (byte) homeScore;
    homeScoreBytes[1] = (byte) (homeScore >> 8);  //you can probably skip these two 
    homeScoreBytes[2] = (byte) (homeScore >> 16); //lines, because I've never seen a                   
                                                  //basketball score above 128, it's
                                                  //such a rare occurance.
    
    FileOutputStream outputStream = getApplicationContext().openFileOutput(FILENAME, Context.MODE_PRIVATE);
    outputStream.write(homeScoreBytes);
    outputStream.close();
    

ここで、外部ストレージを調べることもできますが、この特定のケースでは、外部ストレージが後で存在しない可能性があるため、お勧めしません。(これを選択する場合、許可が必要であることに注意してください)

于 2012-06-09T16:03:41.243 に答える
13

OPは「保存」機能を求めています。これは、プログラムの実行全体でデータを保存するだけではありません(アプリが価値を発揮するには、この機能を実行する必要があります)。

データをSDカードのファイルに保存することをお勧めします。これにより、後で呼び出すだけでなく、ユーザーがデバイスを自分のコンピューターの外付けドライブとしてマウントし、他の場所で使用するためにデータを取得できるようになります。

したがって、本当にマルチポイントシステムが必要です。

1)を実装しonSaveInstanceState()ます。このメソッドでは、基本的に辞書のようなバンドルが渡されます。アプリを中断したところから正確に再起動するために必要な情報をバンドルに保存します。メソッドで、onCreate()渡されたバンドルがnullでないことを確認し、nullでない場合は、バンドルから状態を復元します。

2)実装しonPause()ます。この方法では、SharedPreferencesエディターを作成し、それを使用して、次回アプリを起動するために必要な状態を保存します。これは主にユーザーの設定(名前の由来)で構成されていますが、アプリの起動状態に関連するその他のものもここに配置する必要があります。ここにはスコアを保存せ、アプリを再起動するために必要なものだけを保存します。次に、でonCreate()、バンドルオブジェクトがない場合は常に、SharedPreferencesインターフェイスを使用してそれらの設定を呼び出します。

getFilesDir()3a)スコアなどについては、上記のMathiasのアドバイスに従って、などを使用して、返されたディレクトリにスコアを保存できますopenFileOutput()。このディレクトリはアプリ専用であり、メインストレージに存在します。つまり、他のアプリとユーザーデータにアクセスできなくなります。それでよければ、これがおそらく進むべき道です。

3b)他のアプリやユーザーがデータに直接アクセスできるようにしたい場合、またはデータが非常に大きくなる場合は、SDカードが最適です。他のアプリケーションとの衝突を避けるために(アプリ名が適度に一意であることが確実でない限り)com / user1446371 / casinoballapp /のようなディレクトリ名を選択し、SDカードにそのディレクトリを作成します。マティアスが指摘したように、最初にSDカードがマウントされていることを確認する必要があります。

File sdcard = Environment.getExternalStorageDirectory();
if( sdcard == null || !sdcard.isDirectory()) {
    fail("sdcard not available");
}
File datadir = new File(sdcard, "com/user1446371/basketballapp/");
if( !datadir.exists() && !datadir.mkdirs() ) {
    fail("unable to create data directory");
}
if( !datadir.isDirectory() ) {
    fail("exists, but is not a directory");
}
// Now use regular java I/O to read and write files to data directory

他のアプリケーションが簡単に読み取れるように、データには単純なCSVファイルをお勧めします。

明らかに、「保存」および「開く」ダイアログを許可するアクティビティを作成する必要があります。私は通常、openintentsファイルマネージャーを呼び出して、それが機能するようにします。ただし、これらの機能を利用するには、ユーザーがopenintentsファイルマネージャーをインストールする必要があります。

于 2012-06-09T16:21:21.093 に答える
4

SharedPreferences を使用します。http://developer.android.com/reference/android/content/SharedPreferences.html

サンプルは次のとおりです: http://developer.android.com/guide/topics/data/data-storage.html#pref

データ構造がより複雑であるか、データが大きい場合は、Sqliteデータベースを使用してください。しかし、少量のデータと非常に単純なデータ構造の場合、SharedPrefs で十分であり、DB がオーバーヘッドになる可能性があります。

于 2012-06-09T15:50:25.243 に答える
3

データを保存するには多くのオプションがあり、Android では誰でも選択できます。データ ストレージのオプションは次のとおりです。

共有プリファレンス プライベート プリミティブ データをキーと値のペアで保存します。内部ストレージ デバイスのメモリに個人データを保存します。外部ストレージ 公開データを共有外部ストレージに保存します。SQLite データベース 構造化データをプライベート データベースに格納します。ネットワーク接続 独自のネットワーク サーバーを使用して Web にデータを保存する

例とチュートリアルについては、ここを確認してください

于 2014-04-22T11:10:43.190 に答える
1
  1. 共有設定: ハイスコアの Android 共有設定の例?

  2. アプリケーションは「外部ストレージ メディア」にアクセスできますか。その場合は、単純に値をファイルに書き込み (タイムスタンプとともに保存)、保存できます。タイムスタンプは、探しているものである場合に進行状況を示すのに役立ちます。{賢明な解決策ではありません。}

于 2012-06-09T15:53:05.117 に答える
0

アプリをアンインストールすると、内部ストレージのデータが削除されることを忘れないでください。場合によっては、「予期しない機能」になる可能性があります。それなら外部ストレージを使うといいです。

ストレージに関する Google ドキュメント- 特に getExternalStoragePublicDirectory をご覧ください。

于 2013-10-06T21:40:57.380 に答える
-1

私の意見では、db4o が最も簡単な方法です。ここでチュートリアルを見つけることができます: http://community.versant.com/documentation/reference/db4o-7.12/java/tutorial/

ここからライブラリをダウンロードできます。

http://www.db4o.com/community/download.aspx?file=db4o-8.0-java.zip

(lib ディレクトリの db4o-8.0...-all-java5.jar をプロジェクトの libs フォルダーに入れるだけです。プロジェクトに libs フォルダーがない場合は作成します)

db4o はオブジェクト指向のデータベース システムであるため、オブジェクトをデータベースに直接保存し、後で元に戻すことができます。

于 2012-06-09T15:53:55.223 に答える