Android开发中为什么很少使用JSON存储数据?
Android中数据的存储有五种方式不同的应用及需求,会使用不同的方式去存储数据。
1 使用SharedPreferences存储数据
2 文件存储数据
3 SQLite数据库存储数据
4 使用ContentProvider存储数据
5 网络存储数据
不同的业务逻辑,或者需求,用不同的实现方式,以下是这几中数据存储方式的说明用及法:
第一种: 使用SharedPreferences存储数据
它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。
其存储位置在/data/data/< >/shared_prefs目录下。
第二种: 文件存储数据
关于文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。文件可用来存放大量数据,如文本、、音频等。
默认位置:/data/data/< >/files/。
第三种: SQLite数据库存储数据
SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite。
数据库存储在 data/< 项目文件夹 >/databases/ 下。
第四种: 使用ContentProvider存储数据 ContentProvider其实也是通过数据库的方式来存储数据的,因此这里不再做详细介绍。
第五种 :网络存储数据 也就是说将数据保存在服务器,android上只需要通过httpclient发起一个请求,向服务器获取数据即可。
给你我的一个代码片段,自己去理解吧
解析代码:
/
解析json数据
@param context
源数据
/
private void parseJson(String json)
{
try
{
JSONArray json_1 = new JSONArray(json);
List<Course> list = new ArrayList<Course>();
for (int i = 0; i < json_1length(); i++)
{
JSONObject json_2 = json_1getJSONObject(i);
Systemoutprintln("第一层第" + (i + 1) + "条数据="
+ json_2getString("Name") + "ID:"
+ json_2getInt("ID") + "父级ID:"
+ json_2getInt("ParentID"));
parese(json_2);//TODO
JSONArray json_3 = json_2getJSONArray("Children");
if (json_3length() != 0)
{
for (int j2 = 0; j2 < json_3length(); j2++)
{
JSONObject json_4 = json_3getJSONObject(j2);
Systemoutprintln("第二层第" + (i + 1) + "条数据="
+ json_4getString("Name") + "ID:"
+ json_4getInt("ID") + "父级ID:"
+ json_4getInt("ParentID"));
JSONArray json_5 = json_4getJSONArray("Children");
if (json_5length() != 0)
{
for (int k = 0; k < json_5length(); k++)
{
JSONObject json_6 = json_5getJSONObject(k);
Systemoutprintln("第三层第" + k + "条数据"
+ json_6getString("Name") + "ID:"
+ json_6getInt("ID") + "父级ID:"
+ json_6getInt("ParentID"));
}
}
}
}
}
}
catch (JSONException e)
{
eprintStackTrace();
}
}
数据源:
public class Cosnt
{
public static final String SOURCE = "[{Name:语言知识与语言运用,ID:7332,Children:[{Name:字音,ID:7333,Children:[{Name:字音,ID:7334,Children:[],ParentID:7333}],ParentID:7332},{Name:字形,ID:7339,Children:[],ParentID:7332},{Name:词语,ID:7345,Children:[],ParentID:7332},{Name:句子,ID:7375,Children:[],ParentID:7332},{Name:标点符号,ID:7381,Children:[],ParentID:7332},{Name:修辞,ID:7387,Children:[],ParentID:7332},{Name:语言运用与语言表达,ID:7390,Children:[],ParentID:7332}],ParentID:0},"
+ "{Name:文化、文学常识和名篇名句,ID:7405,Children:[{Name:作家作品,ID:7406,Children:[],ParentID:7405},{Name:古代文化常识,ID:7428,Children:[],ParentID:7405},{Name:名篇名句,ID:7431,Children:[],ParentID:7405}],ParentID:0},"
+ "{Name:文言文,ID :7434,Children:[{Name:文言实词,ID:7435,Children:[],ParentID:7434},{Name:文言虚词,ID:7439,Children:[],ParentID:7434},{Name:文言句式,ID:7442,Children:[],ParentID:7434},{Name:文言文阅读,ID:7445,Children:[],ParentID:7434}],ParentID:0}]";
}
你想在android端拼接这样一个json串?我觉得没必要,你可以post发送这些消息,不用拼接json,不然到服务器端,你还要解析。json串一般是在服务器端拼接,在android端解析。当然,如果你执意要拼接,就只能用sting一点一点拼了。就是用加号将每一个拼接起来,特殊字符转义一下,最后在打印一下,看json格式是否正确!
我做了一个代码如下:
public class MainActivity extends Activity {
ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
listview = (ListView) findViewById(Ridlistview);
String temp = "[{\"aa\":\"1\",\"bb\":\"2\"},{\"aa\":\"3\",\"bb\":\"4\"},{\"aa\":\"5\",\"bb\":\"6\"}]";
List<Map<String, Object>> data = getList(temp);
SimpleAdapter adapter = new SimpleAdapter(this, data, Rlayoutitem, new String[]{"aa","bb"}, new int[]{Ridaa,Ridbb});
listviewsetAdapter(adapter);
}
public Map<String, Object> getMap(String jsonString) {
JSONObject jsonObject;
try {
jsonObject = new JSONObject(jsonString);
@SuppressWarnings("unchecked")
Iterator<String> keyIter = jsonObjectkeys();
String key;
Object value;
Map<String, Object> valueMap = new HashMap<String, Object>();
while (keyIterhasNext()) {
key = (String) keyIternext();
value = jsonObjectget(key);
valueMapput(key, value);
}
return valueMap;
} catch (JSONException e) {
eprintStackTrace();
}
return null;
}
public List<Map<String, Object>> getList(String jsonString) {
List<Map<String, Object>> list = null;
try {
JSONArray jsonArray = new JSONArray(jsonString);
JSONObject jsonObject;
list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < jsonArraylength(); i++) {
jsonObject = jsonArraygetJSONObject(i);
listadd(getMap(jsonObjecttoString()));
}
} catch (Exception e) {
eprintStackTrace();
}
return list;
}
}
item的布局文件
<xml version="10" encoding="utf-8"><LinearLayout xmlns:android="http://schemasandroidcom/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/aa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp" />
<TextView
android:id="@+id/bb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="100dp"
android:textColor="#f00"
android:textSize="30sp" />
</LinearLayout>
最后的界面效果:
是可以用JSON存储数据对象的,而且也是Google推荐的,可以取代以实现Serializable来存储对象的方法。下面是使用JSON存储数据的原因。
Android开发中,涉及到对象存储,通常的做法是直接实现`Serializable`。有关这个接口,它保证了实现该接口的类的对象能够被`ObjectOutput/InputStream`直接输入输出,即序列化。这很方便,但是也很不好。
提到‘序列化’,大多数人都想到`Serializable`,而实际上‘序列化’的只是指“将对象的状态信息转换为可以存储或传输的形式的过程”,Java的`Serializabe`是字节序列化的一种。
`Serialziable`的缺点之一是,实现了该接口的类将失去灵活性。这一点《Effective Java》第74条也指出了,实现了这个`Serializable`的类将会依赖这个类的内部演化,根源在于UID(Serial version UID)。如果你没有指定UID,那么每次这个类被序列化时都会根据这个类的当前状态生成一个UID。想象这么一种场景:这个类已经被导出了,比如发给其他公司或部门使用了,然后你又修改了这个类,那么当你再将这个类发布时,由于UID不同,其他公司或部门的程序员将可能得到一个“InvalidClassException”。
这种情况的根本原因是因为你不能控制序列化的实现,你控制不了UID的生成过程。这就需要一个自定义的序列化形式。在Android中,Google推荐JSON序列化。而且Android程序员也可以使用Gson等工具来进行序列化和反序列化。
和`Serializable`的字节序列化不同,JSON序列化是字符序列化。
此外,`Serializable`只适合存储对象。由于在传输时`Serializalbe`要做大量IO,Android提供了`Parcelable`。
最后,题主不应该把数据库和JSON,XML比较,如果要比,也只能把数据库和文件存储比。数据库适合存储数量大,关系复杂的数据,这样管理,查阅就很方便。与此相对文件存储适合数量小,关系简单的数据。
0条评论