Android开发中为什么很少使用JSON存储数据?

Android开发中为什么很少使用JSON存储数据?,第1张

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比较,如果要比,也只能把数据库和文件存储比。数据库适合存储数量大,关系复杂的数据,这样管理,查阅就很方便。与此相对文件存储适合数量小,关系简单的数据。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » Android开发中为什么很少使用JSON存储数据?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情