2013-02-18 50 views
0

在我的应用程序中,用户可以保存程序将连接到的服务器配置文件。 因为我不知道用户将添加的连接配置文件的数量,我不能简单地将它放在SettingsActivity中。在设置中存储新数据

因为我不想和XML打扰再次文件我想我可以只保存SharedPreferences是这样的:

server1hostname 
server1username 
server1password 
server2hostname 
server2username 
server2password 
server3hostname 
server3username 
server3password 

第一个问题:是否有更好的方法,如果我想要把一切都在标准偏好文件(与创建我自己的文件的地方相反)?

第二个问题:我已经实现了这个或多或少。奇怪的是:它适用于现有设置(最初通过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类的创建功能:

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; 
    } 
} 

Va通过更改功能存储的信息实际上已被保存。由create函数保存的新值不是。

有没有人有想法?在这两个功能中我没有看到任何显着差异。

+0

我可能是错的,但是你不暴露用户密码的情况下,该设备的根源? – Oren 2013-02-18 09:42:30

+0

是的,你是对的。一般的存储过程后,我会添加一些加密。 – Jens 2013-02-18 09:48:03

+0

你有任何logcat错误? – bmavus 2013-02-18 09:57:49

回答

0

第一:不要创建文件来存储用户数据。而不是这个,创建一个数据库。所以你可以读,写或更改数据。这里有一些内容: http://thenewboston.org/list.php?cat=6在这个页面你可以观看#111到#124的内容。他们会教你。

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; 
} 
} 
+0

我非常感谢你的代码。但是,在我看来哪里有什么可能会出现错误? – Jens 2013-02-18 12:23:38

+0

我回答:“有更好的方法吗?”部分是在一个地方存储一个服务器数据,而不是server1hostname,server1username等等。你的提交代码似乎很好。我建议不要在你的重写方法中调用'super.onBackPressed()',如果你坚持调用它,然后在你的'onBackPressed()'方法的末尾移动这行。还要确保你的阅读代码不是越野车,你的提交代码看起来很好。 – 2013-02-18 12:45:14

+0

另外,您无法使用相同的密钥存储数据。我想你已经知道了,但只是确定。如果您已经存储了“server3hostname”一次,再次使用相同的密钥进行存储将取代旧值。 – 2013-02-18 12:51:09