我正在创建一个需要保存多个帐户的帐户信息的应用。我们想要将这些数据存储在SQL数据库中。我们还希望使用熟悉的内置共享首选项代码格式为每个帐户创建和编辑此数据。
我们已为每个帐户的各种项目创建了共享偏好设置的代码。
我们还为SQL数据库创建了代码,该数据库具有首选项中每个项目的所有相同字段以及唯一的,自动递增的id字段(称为acct_id)。我有记录中每个字段的各种setter和getter ...以及添加记录,删除记录和更新记录的典型代码。
首选项屏幕和sqllite帮助程序代码都在...单独测试......
我不确定如何从相应的数据库记录中“加载”共享首选项屏幕以及如何将更改“保存”到相应的数据库记录中。从我在这里和互联网上看到的,我“想”我需要使用偏好编辑器......但是,根据我的阅读,我能找到的所有示例都使用平面文件或XML文件。不确定如何将这些示例用于数据库。
这是我的偏好片段代码......
public class PrefAcctFrag extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefacct);
for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
initSummary(getPreferenceScreen().getPreference(i));
}
}
@Override
public void onResume() {
super.onResume();
// Set up a listener whenever a key changes
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
// Unregister the listener whenever a key changes
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
updatePrefSummary(sharedPreferences, findPreference(key));
}
private void initSummary(Preference p) {
if (p instanceof PreferenceCategory) {
PreferenceCategory pCat = (PreferenceCategory) p;
for (int i = 0; i < pCat.getPreferenceCount(); i++) {
initSummary(pCat.getPreference(i));
}
} else {
updatePrefSummary(getPreferenceManager().getSharedPreferences(),p);
}
}
private void updatePrefSummary(SharedPreferences sharedPreferences, Preference p) {
if (p==null)
return;
if (p instanceof ListPreference) {
ListPreference listPref = (ListPreference) p;
p.setSummary(listPref.getEntry());
} else if (p instanceof EditTextPreference) {
EditTextPreference editTextPref = (EditTextPreference) p;
if (p.getKey().equalsIgnoreCase("editKey")) {
p.setSummary("I am not going to display a password!");
} else {
p.setSummary(editTextPref.getText());
}
} else if (p instanceof MultiSelectListPreference) {
// MultiSelectList Preference
MultiSelectListPreference mlistPref = (MultiSelectListPreference) p;
String summaryMListPref = "";
String and = "";
// Retrieve values
Set<String> values = mlistPref.getValues();
for (String value : values) {
// For each value retrieve index
int index = mlistPref.findIndexOfValue(value);
// Retrieve entry from index
CharSequence mEntry = index >= 0
&& mlistPref.getEntries() != null ? mlistPref
.getEntries()[index] : null;
if (mEntry != null) {
// add summary
summaryMListPref = summaryMListPref + and + mEntry;
and = ";";
}
}
// set summary
mlistPref.setSummary(summaryMListPref);
} else if (p instanceof RingtonePreference) {
// RingtonePreference
RingtonePreference rtPref = (RingtonePreference) p;
String uri;
if (rtPref != null) {
uri = sharedPreferences.getString(rtPref.getKey(), null);
if (uri != null) {
Ringtone ringtone = RingtoneManager.getRingtone(
getActivity(), Uri.parse(uri));
p.setSummary(ringtone.getTitle(getActivity()));
}
}
}
}
}
如上所述,它可以正常工作,并在典型的首选项中存储单个帐户。我现在需要添加代码以将其存储在sql数据库中。
我的SQLLiteHelper看起来像这样......
public class MySQLiteHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION=1;
private static final String DATABASE_NAME="MyDB";
public static final String ACCT_TABLE="acct";
public static final String ACCT_FLD_ID="id";
public static final String ACCT_FLD_TYPE="type";
private static final String CREATE_TABLE_ACCT="CREATE TABLE " + ACCT_TABLE + " ( "+
"id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"name TEXT, " +
"type TEXT)";
public MySQLiteHelper(Context context) {
super(context,DATABASE_NAME,null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_ACCT);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
db.execSQL("DROP TABLE IF EXISTS " + ACCT_TABLE);
this.onCreate(db);
}
public void addAccount(TblAccount acct){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(ACCT_FLD_NAME,acct.get_name());
values.put(ACCT_FLD_TYPE,acct.get_type());
db.insert(ACCT_TABLE, null, values);
db.close();
}
public TblAccount getAccount(int id){
SQLiteDatabase db = this.getReadableDatabase();
String SQL_STRING="SELECT * FROM "+ACCT_TABLE+" WHERE "+ACCT_FLD_ID+" = "+String.valueOf(id);
Cursor cursor =
db.rawQuery(SQL_STRING, null);
TblAccount acct = new TblAccount();
if (cursor!=null) {
cursor.moveToFirst();
acct.set_id(cursor.getInt((cursor.getColumnIndex(ACCT_FLD_ID))));
acct.set_name(cursor.getString(cursor.getColumnIndex(ACCT_FLD_NAME)));
acct.set_type(cursor.getString(cursor.getColumnIndex(ACCT_FLD_TYPE)));
cursor.close();
} else {
acct = null;
}
db.close();
return acct;
}
public int updateAccount(TblAccount acct){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(ACCT_FLD_NAME,acct.get_name());
values.put(ACCT_FLD_TYPE,acct.get_type());
int i = db.update(ACCT_TABLE, values, ACCT_FLD_ID+" = ?",new String[] { String.valueOf(acct.get_id())});
db.close();
return i;
}
public void deleteAccount(TblAccount acct) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(ACCT_TABLE,ACCT_FLD_ID+" = ?",new String[] { String.valueOf(acct.get_id())});
db.close();
}
}
这就是我陷入困境的地方。任何有关示例代码的帮助,建议或链接都可以帮助我找到正确的方向。
由于