Android数据存储方式操作模式解析

2022-08-20 20:43:29
目录
SharedPreferences基本用法操作模式ContentProvider基本概念统一资源标识符(URI)基本使用文件存储基本使用总结

SharedPreferences

在开发过程中,数据存取是较为频繁的,今天我们来了解下android几种常见的数据存取方式。

在Android中,sharePreferences是一种轻量级的数据存储方式,采用键值对的存储方式,存储少量数据,支持基本类型的简单数据存储。

基本用法

    根据Context获取SharedPreferences对象利用edit()方法获取Editor对象。通过Editor对象存储key-value键值对数据。通过commit()方法提交数据。
    public class MainActivity extends Activity {
         @Override
         public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            //获取SharedPreferences对象
            Context ctx = MainActivity.this;  
            //第一个参数指定存储文件名,第二个参数指定操作模式
            SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
            //存入数据
            Editor editor = sp.edit();
            editor.putString("STRING_KEY", "string");
            editor.putInt("INT_KEY", 0);
            editor.putBoolean("BOOLEAN_KEY", true);
            editor.commit();
            //返回STRING_KEY的值 设定默认值
            Log.d("SP", sp.getString("STRING_KEY", "none"));
            //如果NOT_EXIST不存在,则返回值为"none"
            Log.d("SP", sp.getString("NOT_EXIST", "none"));
            //删除指定数据
            editor.remove("STRING_KEY");
            editor.commit();
            //清空数据
            editor.clear();
            editor.commit();
         }
    }
    

    操作模式

      MODE_PRIVATE>MODE_APPEND 该模式会检查文件是否存在,存在就将数据写到文件末尾,否则就创建新文件。MODE_WORLD_READABLE指定该SharedPreferences数据能被其他应用程序读,但不能写。该模式已弃用。MODE_WORLD_WRITEABLE指定该SharedPreferences数据能被其他应用程序写。该模式已弃用。

      ContentProvider

      基本概念

      属于Android四大组件之一,用于进程间进行数据交互,从而能够让其他的应用保存或读取此Content>

      统一资源标识符(URI)

      content://com.example.myapplication.provider/tablename/1
      
        content 主题名,URI前缀。com.example.myapplication.provider 授权信息,Content Provider唯一标识符。tablename Content Provider 指向数据库中的某个表名。1 表中某个记录,若无指定,返回全部记录。

        基本使用

        创建Content>

          创建一个继承了ContentProvider父类的类定义一个名为CONTENT_URI,并且是public static final的Uri类型的类变量,必须为其指定一个唯一的字符串值,最好的方案是以类的全名称。创建数据存储系统。大多数Content Provider使用Android文件系统或SQLite数据库来保持数据,但是也可以以任何你想要的方式来存储。但是,必须为其定义一个叫_id的列,它用来表示每条记录的唯一性。

          示例代码(存储用户名称并显示用户名称,使用SQLite)

          public class MyUsers {
              public static final String AUTHORITY  = “com.wissen.MyContentProvider”;
              // BaseColumn类中已经包含了 _id字段
              public static final class User implements BaseColumns {
              public static final Uri CONTENT_URI  = Uri.parse(content://com.example.MyContentProvider”);
               // 表数据列
               public static final String  USER_NAME  = “USER_NAME”;
              }
          }
          

          如上代码定义了Content Provider的Content_URI和数据列,然后再基于此定义Content Provider类。

          package com.wissen.testApp.android;
          public class MyContentProvider extends ContentProvider {
              private SQLiteDatabase sqlDB;
              private DatabaseHelper dbHelper;
              private static final String  DATABASE_NAME = “Users.db”;
              private static final int DATABASE_VERSION  = 1;
              private static final String TABLE_NAME   = “User”;
              private static final String TAG = “MyContentProvider”;
              //定义SQLite接口
              private static class DatabaseHelper extends SQLiteOpenHelper {
                  DatabaseHelper(Context context) {
                      super(context, DATABASE_NAME, null, DATABASE_VERSION);
                  }
                  @Override
                  public void onCreate(SQLiteDatabase db) {
                  //创建用于存储数据的表
                  db.execSQL(”Create table ” + TABLE_NAME + “( _id INTEGER PRIMARY KEY AUTOINCREMENT, USER_NAME TEXT);”);
                  }
                  @Override
                  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                      db.execSQL(”DROP TABLE IF EXISTS ” + TABLE_NAME);
                      onCreate(db);
                  }
              }
              @Override
              public int delete(Uri uri, String s, String[] as) {
                  return 0;
              }
              @Override
              public String getType(Uri uri) {
                  return null;
              }
              @Override
              public Uri insert(Uri uri, ContentValues contentvalues) {
                  sqlDB = dbHelper.getWritableDatabase();
                  long rowId = sqlDB.insert(TABLE_NAME, “”, contentvalues);
                  if (rowId > 0) {
                      Uri rowUri = ContentUris.appendId(MyUsers.User.CONTENT_URI.buildUpon(), rowId).build();
                      getContext().getContentResolver().notifyChange(rowUri, null);
                      return rowUri;
                  }
                  throw new SQLException(”Failed to insert row into ” + uri);
              }
              @Override
              public boolean onCreate() {
                  dbHelper = new DatabaseHelper(getContext());
                  return (dbHelper == null) ? false : true;
              }
              @Override
              public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
                  SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
                  SQLiteDatabase db = dbHelper.getReadableDatabase();
                  qb.setTables(TABLE_NAME);
                  Cursor c = qb.query(db, projection, selection, null, null, null, sortOrder);
                  c.setNotificationUri(getContext().getContentResolver(), uri);
                  return c;
              }
              @Override
              public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
                  return 0;
              }
          }
          

          如上所示,我们封装了SQLite操作于Content Provider,是我们可以不再关注数据源的操作细节,而直接使用Content Provider进行数据的存取。

          文件存储

          Android文件存储可以用来存放大量数据,如文本、图片、音频等。使用方法类似于java文件存储。

          基本使用

          文件写入

          public void save() {
                  try {
                      FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE)
                      outStream.write(text.getText().toString().getBytes());
                      outStream.close();
                      //成功消息提示
                      Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
           }
          

          写入文件若不存在,则会创建一个新的文件,保存在/data/data/files文件目录下。

          文件读取

          public void load()
          {
              try {
                  FileInputStream inStream=this.openFileInput("a.txt");
                  ByteArrayOutputStream stream=new ByteArrayOutputStream();
                  //分块读取
                  byte[] buffer=new byte[1024];
                  int length=-1;
              while((length=inStream.read(buffer))!=-1)   {
                      stream.write(buffer,0,length);
                  }
                  stream.close();
                  inStream.close();
                  text.setText(stream.toString());
                  Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
          

          总结

          本文简单介绍了Android几个简单的数据存储方式,包括简单数据存取,文件存储,以及如何封装Content>