0

私のアプリケーションでは、ユーザーはプログラムが接続するサーバー プロファイルを保存できます。ユーザーが追加する接続プロファイルの量がわからないので、単純にSettingsActivity.

XML ファイルに再び煩わされたくなかったので、次のように SharedPreferences を保存できると考えました。

server1hostname
server1username
server1password
server2hostname
server2username
server2password
server3hostname
server3username
server3password

最初の質問: すべてを標準設定ファイルに保持したい場合 (どこかに独自のファイルを作成するのとは対照的に)、より良い方法はありますか?

2 番目の質問: 私はすでに多かれ少なかれこれを実装しています。奇妙なことに、既存の設定 (最初に で作成されたものSettingsActivity) では機能しますが、新しいエントリでは機能しません。

ソース コードは次のとおりです (Powerlineはサーバー プロファイルのクラス名です)。

@Override
public void onBackPressed() {
    super.onBackPressed();

    // Save powerline item
    Powerline newPowerline = new Powerline();
    newPowerline.setAddress(etAddress.getText().toString());
    newPowerline.setSendPort(Integer.parseInt(etSendPort.getText().toString()));

    newPowerline.setReceivePort(Integer.parseInt(etReceivePort.getText().toString()));
    newPowerline.setUsername(etUsername.getText().toString());
    newPowerline.setPassword(etPassword.getText().toString());

    int powerlinePositionInSettings = getIntent().getIntExtra("powerlinePositionInSettings", -1);

    if (option.equals("create"))    {
        if (newPowerline.create(this, powerlinePositionInSettings))
            finish();
    } else {
        if (powerlinePositionInSettings >= 0)
            if (newPowerline.change(this, powerlinePositionInSettings))
                finish();
    }
}

Powerlineクラスの create 関数は次のとおりです。

public boolean create(Context context, int powerlinePositionInSettings) {
    String positionString = String.valueOf(powerlinePositionInSettings);        
    Log.i("Powerline", "Saving new powerline to settings to position " + positionString + ".");

    try {
        SharedPreferences.Editor prefsEditor = PreferenceManager.getDefaultSharedPreferences(context).edit();
        prefsEditor.putString("powerline" + positionString + "Address", this.getAddress());
        prefsEditor.putString("powerline" + positionString + "SendPort", String.valueOf(this.getSendPort()));
        prefsEditor.putString("powerline" + positionString + "ReceivePort", String.valueOf(this.getReceivePort()));
        prefsEditor.putString("powerline" + positionString + "Username", this.getUsername());
        prefsEditor.putString("powerline" + positionString + "Password", getPassword());

        Log.i("Prefs", "Saving \"" + "powerline" + positionString + "Address" + "\" to be \"" + this.getAddress() + "\"");

        return prefsEditor.commit();
    } catch(Exception e) {
        e.printStackTrace();
        return false;
    }
}

Powerlineクラスの変更機能は次のとおりです。

public boolean change(Context context, int powerlinePositionInSettings) {
    String positionString = String.valueOf(powerlinePositionInSettings);
    Log.i("Powerline", "Saving powerline to settings to position " + positionString + ".");

    try {
        SharedPreferences.Editor prefsEditor = PreferenceManager.getDefaultSharedPreferences(context).edit();
        prefsEditor.putString("powerline" + positionString + "Address", this.getAddress());
        prefsEditor.putString("powerline" + positionString + "SendPort", String.valueOf(this.getSendPort()));
        prefsEditor.putString("powerline" + positionString + "ReceivePort", String.valueOf(this.getReceivePort()));
        prefsEditor.putString("powerline" + positionString + "Username", this.getUsername());
        prefsEditor.putString("powerline" + positionString + "Password", getPassword());

        Log.i("Prefs", "Saving \"" + "powerline" + positionString + "Address" + "\" to be \"" + this.getAddress() + "\"");

        return prefsEditor.commit();
    } catch(Exception e) {
        e.printStackTrace();
        return false;
    }
}

change 関数によって格納された値は実際に保存されます。create 関数によって保存された新しい値はそうではありません。

誰かアイデアがありますか?2 つの機能に大きな違いは見られません。

4

2 に答える 2

0

このアプローチを使用します。

使用法:

// 電力線を作成する

new Powerline("hostname", "username", "password", 8080, 9090).create(this);

//すべての電力線を更新する

List<Powerline> powerlines = Powerline.getAll(this);
    for (Powerline p : powerlines) {
        p.hostname = p.hostname + " updated";
        p.update(this);
    }

PS: テスト済みのコードです。必要に応じて変更してください。

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

public class Powerline {
private int _id;
public String hostname;
public String username;
public String password;
public int inPort;
public int outPort;

public Powerline(String hostname, String username, String password,
        int inPort, int outPort) {
    super();
    this.hostname = hostname;
    this.username = username;
    this.password = password;
    this.inPort = inPort;
    this.outPort = outPort;
}

public Powerline(String powerlineString) {
    String[] vars = powerlineString.split(":");
    _id = Integer.parseInt(vars[0]);
    hostname = vars[1];
    inPort = Integer.parseInt(vars[2]);
    outPort = Integer.parseInt(vars[3]);
    password = vars[4];
    username = vars[5];
}

public void create(Context context) {
    save(context, increamentKey(context));
}

public void update(Context context) {
    save(context, _id);
}

private void save(Context context, int id) {
    SharedPreferences.Editor ed = PreferenceManager
            .getDefaultSharedPreferences(context).edit();
    ed.putString("powerline:" + id, toString());
    ed.commit();
}

@Override
public String toString() {
    return _id + ":" + hostname + ":" + inPort + ":" + outPort + ":"
            + password + ":" + username;
}

public static List<Powerline> getAll(Context context) {
    SharedPreferences p = PreferenceManager
            .getDefaultSharedPreferences(context);
    List<Powerline> powerlines = new ArrayList<Powerline>();
    Map<String, ?> all = p.getAll();
    for (String key : all.keySet()) {
        if (key.startsWith("powerline:")) {
            powerlines.add(new Powerline(p.getString(key, null)));
        }
    }
    return powerlines;
}

private int increamentKey(Context context) {
    int key = PreferenceManager.getDefaultSharedPreferences(context)
            .getInt("_id", -1);
    PreferenceManager.getDefaultSharedPreferences(context).edit()
            .putInt("_id", ++key).commit();
    // also assign it to current object
    _id = key;
    return key;
}
}
于 2013-02-18T10:30:51.800 に答える
0

最初に: ユーザー データを保存するファイルを作成しないでください。これの代わりに、データベースを作成します。したがって、データの読み取り、書き込み、または変更を行うことができます。http://thenewboston.org/list.php?cat=6このページでは 、#111 から #124 までの説明を見ることができます。彼らはあなたに教えます。

于 2013-02-18T09:49:56.180 に答える