android - Saving ArrayList<Map<String, String>> to a SQLite Database? -
i have fragment
called historyfragment
contains listview
. items of listview
added class called datamodel
. i'm trying save list whenever item added list. (at moment, views in list textview
s, later hope add images them, , have multiple lines etc. these need saved well). list is: arraylist<map<string, string>>
, called mplanetlist
.
i think saving sqlitedatabase
solution, seems complicated after reading multiple answers/tutorials.
some sites i've looked at:
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
there lots of questions in "question" main question comes in 2 parts:
a) database
right solution?
--> if 'yes' --> b) simple way make one? prefer not use json/gson
--> if 'no' --> c) should use instead? sharedpreferences
?
assuming database
correct solution, think need serialize arraylist or possibly use stringset - have no idea how have arraylist this: arraylist<map<string, string>>
opposed arraylist without map object.
also, tried access database datamodel
class (as add items list) can't work.
i have added current code - work database not complete, stuck should next.
this historyfragment
class:
// remove imports public class historyfragment extends fragmentbase implements onitemaddedhandler { // fragmentbase class extends fragment , 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 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 top of list } @override public void onstart() { super.onstart(); datamodel.getinstance().setonitemaddedhandler(this); } }
this 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 want load 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)); // want save items database historydatabase.getinstance(); //adding .getwritabledatabase() gives me nullpointerexception. // don't understand else need here add mplanetlist database if (null != monitemaddhandler) { monitemaddhandler.onitemadded(data1); } } }
and here database:
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; } }
very basically: want save listitems permanently, , able retreive, edit , delete them.
thank taking time read this. if clarification needed, please say.
the sqlitedatabase
correct solution.
you can save data of every item database. there hashmap<string, object>
instead of hashmap<string, string>
in each item data, in case of want put integer or other simple type data hashmap.
then, can serialize hashmap
json
when going save database:
// can put multiple data 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);
you can unserialize
after fetch serialized data database:
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(); (int = 0; < names.length(); i++) { string key = names.getstring(i); datahashmap.put(key, json.opt(key)); } } catch (jsonexception e) { e.printstacktrace(); }
Comments
Post a Comment