我有Fragment
调用HistoryFragment
它包含一个ListView
。 ListView
的项目被称为DataModel
的另一个类添加。我试图做的是每当一个项目被添加到列表中时保存列表。 (目前,我列表中的视图只有TextView
s,但后来我希望为它们添加图像,并且有多行等等,因此这些也需要保存)。我的清单是:ArrayList<Map<String, String>>
,它被称为mPlanetList
。将ArrayList <Map <String,String >>保存到SQLite数据库中?
我认为保存到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
有很多在这个“问题”的问题,但我的主要问题有两个部分:
A)是DataBase
权解?
- >如果'是' - > b)制作一个简单的方法是什么?我宁愿不使用JSON/GSON
- >如果'不' - > c)我应该用什么来代替? SharedPreferences
?
假设DataBase
是正确的解决方案,我想我需要序列化我的ArrayList或者可能使用StringSet - 我不知道该怎么做,因为我有这样一个ArrayList:ArrayList<Map<String, String>>
,而不是一个ArrayList,而不地图对象。
此外,我试图从我的DataModel
类访问我的数据库(因为这是我的项目添加到列表中),但我无法让它工作。
我已经添加了我的当前代码 - DataBase的工作并不完整,但我坚持接下来应该做的事情。
这是我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);
}
}
这是我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);
}
}
}
最后这里是我的数据库:
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;
}
}
非常基本上是:我要救我的列表项永久性地存在,并且能够检索,编辑和删除它们。
感谢您花时间阅读本文。如果需要澄清,请说。
你不需要为它使用dataModel。只需为PlanetData创建SQLLITEHelper类并添加用于在表中插入数据的方法并从历史片段类中调用它。并在SQLHelper中添加另一个获取数据方法以获取所有数据,并在需要任何数据时调用该方法 –
@ArmaanStranger我使用DataModel添加项目,因为字符串来自不同的片段 – RiThBo
ohk ... bt如果您正在使用SQLLite比您可以直接将数据添加到SQL表,因此您将直接在另一个片段中获取数据。 –