• android五种数据存储方式


    在Android中提供了如下五种数据存储方式:

    • SharedPreferences
    • 文件存储
    • SQLite数据库方式
    • 内容提供器(ContentProvider)
    • 网络存储

    下面具体介绍一下这五种数据存储方式的用法。

    1. SharedPreferences

    SharedPreferences是android平台上的一个轻量级存储类,主要保存一些常用的配置信息。可以保存long、int、String类型数据。

    SharedPreferences以键值对方式读取和存入,最终会以XML方式保存数据,在处理这些XML数据时,Dalvik会通过自带底层的本地XML Parser进行解析。

    SharedPreferences使用方法很简单:

    保存数据是通过getSharedPreferences方法获得Editor对象,调用Editor的putString(String key, String value)等方法上传键值对,最后调用commit方法进行提交

    读取数据是直接通过getSharedPreferences方法获得SharedPreferences对象,调用它的getString(String key, String defValue)等方法获取key对应的值即可。

    SharedPreferences getSharedPreferences(String name, int mode)

    Added in API level 1
    Retrieve and hold the contents of the preferences file 'name', returning a SharedPreferences through which you can retrieve and modify its values. Only one instance of the SharedPreferences object is returned to any callers for the same name, meaning they will see each other's edits as soon as they are made.
    Parameters
    name
    Desired preferences file. If a preferences file by this name does not exist, it will be created when you retrieve an editor (SharedPreferences.edit()) and then commit changes (Editor.commit()).
    mode
    Operating mode. Use 0 or MODE_PRIVATE for the default operation, MODE_WORLD_READABLE and MODE_WORLD_WRITEABLE to control permissions.
    Returns
    The single SharedPreferences instance that can be used to retrieve and modify the preference values.

    public static interface
    SharedPreferences.Editor
     
    Interface used for modifying values in a SharedPreferences object. All changes you make in an editor are batched, and not copied back to the original SharedPreferences until you call commit() or apply()

    MainActivity测试代码:

     1 import android.app.Activity;
     2 import android.content.SharedPreferences;
     3 import android.os.Bundle;
     4 import android.view.View;
     5 import android.widget.Button;
     6 import android.widget.EditText;
     7 import android.widget.TextView;
     8 
     9 public class MainActivity extends Activity {
    10 
    11     private Button mBtnSave, mBtnRead;
    12     private EditText mEtOrigin;
    13     private TextView mTvNew;
    14 
    15     @Override
    16     protected void onCreate(Bundle savedInstanceState) {
    17         super.onCreate(savedInstanceState);
    18         setContentView(R.layout.activity_main);
    19 
    20         mBtnSave = (Button)findViewById(R.id.btn_save);
    21         mBtnRead = (Button)findViewById(R.id.btn_read);
    22         mEtOrigin = (EditText)findViewById(R.id.et_origin);
    23         mTvNew = (TextView)findViewById(R.id.tv_new);
    24 
    25         mBtnSave.setOnClickListener(new View.OnClickListener() {
    26             @Override
    27             public void onClick(View v) {
    28                 saveBySharedPreferences();
    29             }
    30         });
    31 
    32         mBtnRead.setOnClickListener(new View.OnClickListener() {
    33             @Override
    34             public void onClick(View v) {
    35                 readFromeSharedPreferences();
    36             }
    37         });
    38     }
    39 
    40     private void readFromeSharedPreferences() {
    41         SharedPreferences sharedData = getSharedPreferences("data", 0);
    42         String data = sharedData.getString("item", null);
    43         mTvNew.setText(data);
    44     }
    45 
    46     private void saveBySharedPreferences() {
    47         SharedPreferences.Editor sharedData =
    48                 getSharedPreferences("data", 0).edit();
    49         String data = mEtOrigin.getText().toString();
    50         sharedData.putString("item", data);
    51         sharedData.commit();
    52     }
    53 
    54 
    55 }
    View Code

    测试界面

     测试SharedPreferences界面

    在两个Activity之间,除了可以通过Intent来传递数据,还可以使用SharedPreferences共享数据的方式实现数据传递。

    SharedPreferences优点:存取方便;缺点:只适用于存取比较简单的数据

    2. 文件存储

    顾名思义,以文件方式存取数据。

    在Android中可以使用openFileInput()和openFileOutput()来读取设备上的文件(该应用目录下的文件)。

    如果要读取非自身目录下的文件,会抛出异常。

    如果在调用FileOutputStream时指定的文件不存在,Android会自动创建它。在默认情况下,写入会覆盖原文件内容,可以通过指定模式为Context.MODE_APPEND将新写入内容附加到原文件内容后面。

    除了openFileInput()和openFileOutput可以读写文件外,在Android中还可以使用deleteFile()和fileList()等来操作文件。

    对于应用程序所需的资源文件,可以将其放在“/res/raw/"文件夹下,可以通过getResources获取资源。

    3. SQLite存储:

    SQLite是Android自带的标准数据库,支持统一的SQL语句。

    SQLite遵守ACID关联式数据库管理系统。(ACID是数据库事务正确执行的4个基本要素的缩写,具体包括:原子性Atomicity,一致性Consistency,隔离性Isolation,持久性Durability。一个支持事务的数据库系统,必须具有这四种属性,否则无法在事务过程中保证数据的正确性)

    默认情况下,每个应用所创建的数据库都是私有的,其名字是唯一的,各应用间无法相互访问对方的数据库。各应用生成的数据库存储在/data/data/<包名>/database目录下。

     

    使用SQLite:

    有两种使用方式:

    第一种是通过Context类的openOrCreateDatabase(String name, int mode, CursorFactory factory)方法来创建一个新的数据库或打开一个已有的数据库,并返回一个SQLiteDatabase对象,然后调用这个对象的execSQL方法来进行操作。这种方式执行创建数据库表操作时,需要首先通过databaseList()返回应用中所有的数据库,查询所要创建的数据库是否存在,不存在才进行创建;

    为了避免查询操作,第二种方式通过辅助类SQLiteOpenHelper对数据库进行创建管理。调用这个类的getWritableDatabase()或者getReadableDatabase()获取SQLiteDatabase对象,然后通过调用SQLiteDatabase对象的execSQL方法执行SQL语句或者是insert、update、delete、query等方法简化操作,对数据库表进行创建、插入、删除、查询操作。返回的查询结果放到Cursor对象中。

    类SQLiteOpenHelper是抽象类,需要实现他的三个抽象方法:onCreate(SQLiteDatabase db), onOpen(final SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldeVersion, int newVersion)。onCreate方法在数据库创建时被调用,onOpen方法是打开数据库的回调函数,onUpgrade方法在数据库升级时被调用。onCreate和onUpgrade方法必须要实现,onOpen方法可以选择实现。

    SQL表达式中表示输入值的字符串一定要用单引号括起来,否则数据库会出现故障。

    Android提供了SQLite数据库的触发器(Trigger)机制。触发器机制是一种特殊的数据操作机制,在试图对指定的数据表执行制定的修改语句时,特定的数据操作将被自动执行。在应用中有多个数据表时,可以用触发器来自动实现一些关联操作。在SQLiteOpenHelper的实现类中的onCreate和onUpgrade方法中建立触发器。但在数据库升级时不要忘了删除存在的触发器。

    优点:占用非常少的资源,可以存储复杂结构的数据

     

    4. Content Provider:

    前面三种数据存储方式存储的数据一般只供一个应用本身使用,如果想要在多个应用之间共享数据,则需要用到Content Provider。

    它把需要共享的数据封装起来,并提供了一组供其它应用程序调用的接口进行相关的存储操作。

    Content Provider使用方法:

    Android中应用并不直接访问Content Provider,而是通过ContentResolver接口方法来操作Content Provider对象。通过Context类的getContentResolver方法可以获得ContentResolver对象。

    每个Content Provider存储的数据都以表的形式存在,这些表都拥有唯一的URI作为身份标识。URI的组成遵循RFC2396,具体为<scheme>://<authority><path>?<query>,它类似于一个指定路径的字符串。对于Content Provider的数据表,其URI的<scheme>字段内容固定为"content",<authority>字段内容指定了Content Provider的具体类别。

    生成URI有两种方法,一种是ContentUris类的Uri ContentUris.withAppendedId(Uri contentUri, long id)和Uri类的Uri Uri.withAppendedPath(Uri baseUri, String pathSegment)。

    通过ContentResolver接口操作Content Provider时,需要指定具体的URI参数,系统根据URI中的<authority>字段来判断需要将请求传递给哪一种Content Provider。由Content Provider具体解析剩余的URI字符串内容,以确定具体操作的表及记录的类型。

    千里之行,始于足下~
  • 相关阅读:
    斐波那契数列变形
    poj 1061 青蛙的约会+拓展欧几里得+题解
    Leading and Trailing LightOJ
    HDU-1576 A/B 基础数论+解题报告
    swal() 弹出层的用法
    jqurey.running.min.js运动的字体效果
    echarts中dataZoom的使用
    echarts动态添加数据
    设备适配尺寸
    sublime Text3 插件
  • 原文地址:https://www.cnblogs.com/wm123/p/5277698.html
Copyright © 2020-2023  润新知