RiT*_*hBo 0 android android-listview android-sqlite
我有一个包含a 的Fragment被叫.其中的项目由另一个叫做的类添加.我想要做的是在项目添加到列表时保存列表.(目前,我的列表中的视图只是s,但后来我希望向它们添加图像,并且有多行等等,所以这些也需要保存).我的列表是:它被调用.HistoryFragmentListViewListViewDataModelTextViewArrayList<Map<String, String>>mPlanetList
我认为保存到a SQLiteDataBase是解决方案,但即使在阅读了多个答案/教程后看起来也很复杂.
我看过的一些网站:
http://www.vogella.com/articles/AndroidSQLite/
http://developer.android.com/guide/topics/data/data-storage.html#db
http://stackoverflow.com/q/5482402/2442638
http://stackoverflow.com/q/3142285/2442638
Run Code Online (Sandbox Code Playgroud)
这个"问题"中有很多问题,但我的主要问题分为两部分:
a)是DataBase正确的解决方案吗?
- >如果'是' - > b)制作一个简单的方法是什么?我宁愿不使用JSON/GSON
- >如果'不' - > c)我应该使用什么? SharedPreferences?
假设a DataBase是正确的解决方案,我想我需要序列化我的arraylist或者可能使用StringSet - 我不知道怎么做,因为我有这样的arraylist:ArrayList<Map<String, String>> 而不是没有map对象的arraylist.
此外,我试图从我的DataModel类访问我的数据库(因为这是我将我的项目添加到列表中),但我无法让它工作.
我已经添加了我当前的代码 - 数据库的工作还没有完成,但我仍然坚持下一步该做什么.
这是我的HistoryFragment班级:
// Remove imports
public class HistoryFragment extends FragmentBase implements OnItemAddedHandler {
// FragmentBase is just another class which extends Fragment and the moment.
ListView lv;
SimpleAdapter simpleAdpt;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.history, container, false);
ListView lv = (ListView) view.findViewById(R.id.listView);
List<Map<String, String>> planetsList = DataModel.getInstance()
.getPlanetList();
simpleAdpt = new SimpleAdapter(getActivity(), planetsList,
android.R.layout.simple_list_item_1, new String[] { "planet" },
new int[] { android.R.id.text1 });
lv.setAdapter(simpleAdpt);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parentAdapter, View view,
int position, long id) {
TextView clickedView = (TextView) view;
// Display a dialog
}
});
return view;
}
@Override
public void onDetach() {
super.onDetach();
DataModel.getInstance().setOnItemAddedHandler(null);
}
@Override
public void onItemAdded(Object data) {
simpleAdpt.notifyDataSetChanged();
lv.scrollTo(0, 0); // Scrolls to top of list
}
@Override
public void onStart() {
super.onStart();
DataModel.getInstance().setOnItemAddedHandler(this);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的DataModel:
public class DataModel {
private List<Map<String, String>> mPlanetsList = new ArrayList<Map<String, String>>();
private static DataModel instance;
private static OnItemAddedHandler mOnItemAddHandler;
private DataModel() {
initList();
}
public static DataModel getInstance() {
if (null == instance) {
instance = new DataModel();
}
return instance;
}
private void initList() {
// Here is where I want to load the saved listitems.
}
public List<Map<String, String>> getPlanetList() {
return mPlanetsList;
}
private HashMap<String, String> createPlanet(String key, String name) {
HashMap<String, String> planet = new HashMap<String, String>();
planet.put(key, name);
return planet;
}
public void setOnItemAddedHandler(OnItemAddedHandler handler) {
mOnItemAddHandler = handler;
}
public void addItem(Object data) { // Save stuff here?
Bundle data1 = new Bundle();
String string = ((Bundle) data).getString("keyTitle");
mPlanetsList.add(0, createPlanet("planet", string));
// This is where I want to save my items to the DataBase
HistoryDataBase.getInstance(); //Adding .getWritableDatabase() gives me a nullpointerexception.
// I don't understand what else I need to do here to add my mPlanetList to the DataBase
if (null != mOnItemAddHandler) {
mOnItemAddHandler.onItemAdded(data1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后这是我的数据库:
public class HistoryDataBase extends SQLiteOpenHelper {
private static HistoryDataBase instance;
public static final String TABLE_COMMENTS = "comments";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_COMMENT = "comment";
private static final String DATABASE_NAME = "commments.db";
private static final int DATABASE_VERSION = 1;
// Database creation sql statement
private static final String DATABASE_CREATE = "create table "
+ TABLE_COMMENTS + "(" + COLUMN_ID
+ " KEY, " + COLUMN_COMMENT
+ " text not null);";
static Context c;
HistoryDataBase(Context context) {
super(c, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
public static HistoryDataBase getInstance() {
if (null == instance) {
instance = new HistoryDataBase(c);
}
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
非常基本:我想永久保存我的列表项,并能够进行检索,编辑和删除它们.
感谢您抽出时间来阅读.如果需要澄清,请说.
这SQLiteDataBase是正确的解决方案.
您可以将每个项目的数据保存到数据库中.如果要将整数或其他简单类型数据放入hashmap,将会有一个HashMap<String, Object>而不是HashMap<String, String>每个项目数据.
然后,您可以序列化HashMap到json时你要保存到数据库:
// you can put multiple data into this hashmap
HashMap<String, Object> dataHashMap = new HashMap<String, Object>();
ContentValues values = new ContentValues();
values.put("data", new JSONObject(dataHashMap).toString());
db.insert(TABLE_NAME, COL_ID, values);
Run Code Online (Sandbox Code Playgroud)
unserialize从数据库中获取序列化数据后可以执行以下操作:
int rawDataIndex = 6;
String rawData = cursor.getString(rawDataIndex);
HashMap<String, Object> dataHashMap = new HashMap<String, Object>();
try {
JSONObject json = new JSONObject(rawData);
JSONArray names = json.names();
for (int i = 0; i < names.length(); i++) {
String key = names.getString(i);
dataHashMap.put(key, json.opt(key));
}
} catch (JSONException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5252 次 |
| 最近记录: |