android主要有5中数据存储方式,如下:

1. 使用SharedPreferences存储数据。

2. 使用文件存储

3.使用SQLlite存储

4. 使用ContentProvider存储

5. 网络存储

1.使用SharedPreferences存储数据

首先说明SharedPreferences存储方式,它是Android提供的用来存储一些简单配置信息的一种机制,例如:登录用户的用户名与密码。其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入,具体实例如下:

void ReadSharedPreferences()
{
String strName,strPassword;
SharedPreferences user = getSharedPreferences(“user_info”,0);
strName = user.getString(“NAME”,””);
strPassword = user getString(“PASSWORD”,””);
}

void WriteSharedPreferences(String strName,String strPassword)
{
SharedPreferences user = getSharedPreferences(“user_info”,0);
uer.edit();
user.putString(“NAME”, strName);
user.putString(“PASSWORD” ,strPassword);
user.commit();
}

数据读取与写入的方法都非常简单,只是在写入的时候有些区别:先调用edit()使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改的数据。实际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。以上面的数据存储结果为例,打开后可以看到一个user_info.xml的文件,打开后可以看到:
<?xml version=”1.0″ encoding=”UTF-8″?>
<map>
<string name=”NAME”>moandroid</string>
<string name=” PASSWORD”>SharedPreferences</string>
</map>
使用SharedPreferences是有些限制的:只能在同一个包内使用,不能在不同的包之间使用。

2.使用文件存储

Android中读取/写入文件的方法,与Java中的I/O是一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。但是在默认状态下,文件是不能在不同的程序之间共享的,以上两个方法只支持读取该应用目录下的文件,读取非其自身目录下的文件将会抛出FileNotFoundException异常。创建的文件存放在/data/data/<package name>/files目录下。

//读取文件

FileInputStream fis = openFileInput(“text1.txt”);

… …

fis.close(); //关闭输入流

//写入文件

FileOutputStream fos = openFileOutput(“text1.txt”,MODE_APPEND);

… …

fos.close(); //关闭输出流

3.SQLLite存储数据

SQLLite是最常见和使用最多的存储方式了。

SQLite 的数据库的结构如下:

SQLite DataBaseName 由N个TableName构成,每个Table相当于一个Excel表格,也就是说每个表格的数据由行和列组成。一般我们的一组数据,构成一行。例如通讯录的一个记录:名字,地址,邮件,电话,手机等列构成一个完成的信息,这条信息在数据库里面就是一列。

每一列都是有标识的,就像我们做的Excel一样。例如姓名:则这一列下面全部都是姓名。这样,整个数据库的结构就很简单了。

操作数据库:创建、打开

SQLiteDatabase.openDatabase(string path,SQLiteDatabase.CursorFactory factory ,int flags).

或者

Context.openOrCreateDatabase(String name,int mode,SQLiteDatabase.CursorFactory factory)

使用游标

不管你如何执行查询,都会返回一个 Cursor,这是 Android 的 SQLite 数据库游标,使用游标,你可以:

通过使用 getCount() 方法得到结果集中有多少记录;

通过 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍历所有记录;

通过 getColumnNames() 得到字段名;

通过 getColumnIndex() 转换成字段号;

通过 getString(),getInt() 等方法得到给定字段当前记录的值;

通过 requery() 方法重新执行查询得到游标;

通过 close() 方法释放游标资源;

Android平台下数据库相关类

1。SQLiteOpenHelper 抽象类:通过从此类继承实现用户类,来提供数据库打开、关闭等操作函数。

2。SQLiteDatabase 数据库访问类:执行对数据库的插入记录、查询记录等操作。

3。SQLiteCursor 查询结构操作类:用来访问查询结果中的记录。

4.contentProvider存储方式

ContentResolver是通过ContentProvider来获取其他与应用程序共享的数据

其中ContentProvider负责

  • 组织应用程序的数据;
  • 向其他应用程序提供数据;

ContentResolver则负责

  • 获取ContentProvider提供的数据;
  • 修改/添加/删除更新数据等;

    ContentProvider 是如何向外界提供数据的?

    Android提供了ContentProvider,一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProviders是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的“数据库”。至于如何从URI中识别出外界需要的是哪个“数据库”,这就是Android底层需要做的事情了,不在此详细说。简要分析下ContentProvider向外界提供数据操作的接口:

    query(Uri, String[], String, String[], String)

    insert(Uri, ContentValues)

    update(Uri, ContentValues, String, String[])

    delete(Uri, String, String[])

    1. ContentProvider是什么时候创建的,是谁创建的?访问某个应用程序共享的数据,是否需要启动这个应用程序?这个问题在Android SDK中没有明确说明,但是从数据共享的角度出发,ContentProvider应该是Android在系统启动时就创建了,否则就谈不上数据共享了。这就要求在AndroidManifest.XML中使用<provider>元素明确定义。
    2. 可能会有多个程序同时通过ContentResolver访问一个ContentProvider,会不会导致像数据库那样的“脏数据”?这个问题一方面需要数据库访问的同步,尤其是数据写入的同步,在AndroidManifest.XML中定义ContentProvider的时候,需要考虑是<provider>元素multiprocess属性的值;另外一方面Android在ContentResolver中提供了notifyChange()接口,在数据改变时会通知其他ContentObserver,这个地方应该使用了观察者模式,在ContentResolver中应该有一些类似register,unregister的接口。

    5.网络存储

    需要与Android 网络数据包打交道

    Android的网络存储使用HTTP协议,我们编写的Android网络应用就相当于一个浏览器。由于Android的应用是使用Java来开发的,所以网络应用使用的也是J2SE的包。

    Android如何与服务器交互数据?我们可以建立一个WEB应用,这对我们来说是一件十分容易的事。在WEB应用的相关请求处理中接收Andorid提交的数据、返回XML数据或JSON数据。Android发送相应的请求并接收服务相应的数据。这就是AndroidWEB应用的数据交互。

    Android发送请求和获取数据如下:

    String path = "http://www.android.com/images/opensourceproject.gif";

    URL url = new URL(path);

    HttpURLConnection conn = (HttpURLConnection)url.openConnection();

    conn.setConnectTimeout(6 * 1000);

    InputStream inStream = conn.getInputStream();

    既然获得了InputStream,那么对数据进行操作就比较容易了。

    更多相关文章

    1. Android系列教程之六:TextView小组件的使用--附带超链接和跑马灯
    2. Android(安卓)菜单(Menu)控件的使用
    3. android通过网络下载文字和Mp3的例子
    4. Android之使用传感器获取相应数据
    5. mybatisplus的坑 insert标签insert into select无参数问题的解决
    6. 箭头函数的基础使用
    7. python起点网月票榜字体反爬案例
    8. NPM 和webpack 的基础使用
    9. Python list sort方法的具体使用

    随机推荐

    1. Android(安卓)APK反编译详解(附图)
    2. 高级组件之自动完成文本框
    3. Android布局(相对布局)
    4. android makefile prebuild
    5. Android(安卓)缩放、移动、旋转View相关
    6. Android之查看外部依赖jar的源码_android
    7. Android之Audio初探
    8. 转-Android(安卓)UI学习 - Tab的学习和使
    9. 数据存储和界面展示一
    10. android调用系统功能