2013-07-23 43 views
0

我有Fragment调用HistoryFragment它包含一个ListViewListView的项目被称为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; 
} 
} 

非常基本上是:我要救我的列表项永久性地存在,并且能够检索,编辑和删除它们。

感谢您花时间阅读本文。如果需要澄清,请说。

+0

你不需要为它使用dataModel。只需为PlanetData创建SQLLITEHelper类并添加用于在表中插入数据的方法并从历史片段类中调用它。并在SQLHelper中添加另一个获取数据方法以获取所有数据,并在需要任何数据时调用该方法 –

+0

@ArmaanStranger我使用DataModel添加项目,因为字符串来自不同的片段 – RiThBo

+1

ohk ... bt如果您正在使用SQLLite比您可以直接将数据添加到SQL表,因此您将直接在另一个片段中获取数据。 –

回答

7

SQLiteDataBase是正确的解决方案。

您可以将每个项目的数据保存到数据库中。如果要将整数或其他简单类型数据放入散列映射中,将在每个项目数据中会有一个HashMap<String, Object>而不是HashMap<String, String>

然后,您可以序列化HashMapjson当你打算把它保存到数据库:

// 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); 

你可以做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(); 
    } 
+0

嗨,我们可以存储自定义对象而不是对象吗? –

0

尝试使用JSONArray的结构,其中每个元素都是JSONObject。

JSON有默认的构造函数来将数据转换为字符串并从字符串中解析。

因此,您需要的是数据库中的TEXT字段。

相关问题