Android数据存储的5种方式

来源:互联网 发布:天津总医院挂号软件 编辑:程序博客网 时间:2024/05/23 01:04

      Android数据存储在开发中是经常遇到的,在Android中数据存储的方式有5种:

1.使用SharedPreference 存储数据

2.文件存储数据   

3.SQLite数据库存储数据   

4.使用ContentProvider存储数据。

5.网络存储数据


一。存储数据

    本质是基于xml文件存储key-value键值对数据。通常用来存储一些简单的配置信息。存储位置在/data/data/相应包名/shared_prefs/目录下。

实现SharedPreference存储与取出数据的步骤是:

1.利用context获取SharedPreference对象,里面有两个参数:第一个参数是share文件的名字,第二个参数是文件的读写权限

SharedPreference sp = context.getSharedPreference();

2.获取SharedPreference的Editor的对象

Editor editor = sp.edit();

3.利用editor存储key-value键值对

editor.put("key",value);

editor.put("key",value);

editor.put("key",value);

4.提交存储信息

editor.commit();


获取SharedPreference里面存储的数据

1.获取SharedPreference的对象,参数同上

       SharedPreference sp = context.getSharedPreference();

2.获取里面存储的数据

    String value  =  sp.getString();//这里不止是String类型,还有很多基本类型的。


 SharedPreference是一种轻量级的数据存储方式,很方便,但是也有其自身的缺陷:比如存储的数据比较简单,只有boolean、int、String、float、long类型的,而且不能进行条件查询。

二。文件存储数据

  关于文件存储,Activity提供了openFileOutput()方法用于把数据存储到文件中,文件可用来存储大量的数据,比如图片、文本、音频。默认位置是:/data/data/包名/files/...

  示例代码:

    public   void  save(){

    FileOutputStream fos = this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE);

    

   参数解析:    第一个参数用于指定要创建的文件的名称,不能包含路径分隔符“/”,如果文件不存在,Android会自动      创建。创建的文件会保存在/data/data/包名/files下。

   第二个参数用于指定文件的操作模式。

   有四种操作模式:

    Context.MODE_PRIVATE = 0//私有模式

  Context.MODE_APPEND = 32768//追加模式
  Context.MODE_WORLD_READABLE = 1//可读
  Context.MODE_WORLD_WRITEABLE = 2//可写

  Context.MODE_PRIVATE为默认操作模式,表明该文件是私有数据,只能被该应用程序访问,在该模式下,写   入的内容会覆盖原本文件的内容
  Context.MODE_APPEND为追加模式,该模式会检查当前文件是否存在,如果存在,就往文件追加内容,如果   不存在,就会创建该文件。
  Context.MODE_WORLD_READABLE:表示当前的文件可以被其他应用读取。  
  Context.MODE_WORLD_WRITEABLE:表示当前的文件可以被其他应用修改。
  Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE:表示当前的文件可以被其他应用读写。

  fos.write(text.toString().getBytes());
  fos.close();
  在此对该数据存储的方式进行解析: openFileOutput()方法是activity提供的,该方法的两个参数在上面   已经解析过了。该方法的作用就是:打开一个指定名字的文件供写入内容,如果该文件不存在,Android会     进行自动创建。
  fos.write();是将指定的内容写入到刚才打开的文件中。 



 //读取文件的操作
 public void readFile(){

  FileInputStrem fis = this.openFileInput("a.txt");
  ByteArrayOutputStream stream=new ByteArrayOutputStream();
  byte buffer = new Byte[1024];
  int length = -1;
  while((length = fis.read(buffer))!=-1){ //明天试下流程
   stream.write(buffer,0,length);
}
  stream.close();
  fis.close();
  strem.toString();
}
方法解析:openFileInput()只有一个参数:name是文件的名字  这个方法的作用是打开一个文件供读取。
   fis.read(buffer);buffer是字节数组,读取指定文件的内容并存储到字节数组中
   stream.write();将字节数组中的字节读取到写入到输出流中。

}


activity还提供了 getFileDir()和getCacheDir()两种方法: getFileDir()获取的是data/data/应用包名/files目录   getCacheDir()获取的是data/data/应用包名/cache目录

把文件存入到SD卡中:

使用到的权限是:

android:name="android.permission.WRITE_EXTERNAL_STORAGE //写入数据的权限

android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS//创建与删除文件的权限

要往SD卡中存放文件,需要首先判断SD是否已经挂载

 Environment.getExternalStorageState()//获取当前SD卡的状态  

 MEDIA_MOUNTED:表明sd卡是存在并具有读/写权限   


 

 if(Environment.getExternalStorageState.equals(Environment.MEDIA_MOUNT)){

   File fileDir = Environment.getExternalStorageDirectory();//得到SD卡文件存储路径

  File file = new File(fileDir,"a.txt");

  FileOutputStream fos = new FileOutputStream(file);

  fos.write(content.toString().getBytes());

  fos.close();

}

 数据存储的第三种方式:SQLite数据库存储


 步骤:

1.自定义一个类继承于SQLiteOpenHelper,重写构造方法,在构造方法中创建出数据库,重写OnCreat()方法和Onupgrage()方法 ,Oncreat()方法初始化表格信息,Onupgrage()是更新数据库版本的方法

2.自定义数据库操作类,增删改查的方法。

数据库增删改查的方式有两种:

1.执行sql语句

2.使用ContentValue存储数据信息 执行 insert delete update  query等方法进行数据库操作。


数据存储的第四种方式:ContentProvider

ContentProvider主要是应用于应用程序间的数据共享的。主要是用到了进程间Binder通信机制,把共享数据存储到共享内存里面,返回给调用者一个打开共享数据的文件标识符。

其实在笔者自己看来:所谓的contentProvider很简单,跟我们经常使用的http请求一样。数据存储的SQLite或者文件就相当于后台使用的Mysql,自定义的Content Provider相当于severlet接口,它的主要作用就是接收数据请求以及连接数据库,调取数据库的操作获取返回的数据,并把数据返回给请求者,

而我们使用ContentResolver去调用一些方法对数据进行增删改查的操作。这就是一个数据请求的过程。可能我的理解稍微简单,如果有人觉得不对,希望能指点下。

 具体的实现步骤:

1.建立数据的存储系统

   数据的存储系统可以由开发者自行决定,是用file文件还是用SQLite数据库。

2.提供数据共享的接口。

  自定义content Provider的子类,实现6个方法:query(); insert(); update();

3.使用ContentResovler进行数据操作

例子:

public class DBOpenHelper extends SQLiteOpenHelper {
public static final String myProvider_table_name="myProvider_table_name";
String sql="create table myProvider_table_name(_id integer,name text)";
public DBOpenHelper(Context context) {
super(context, "myPrivoder.db", null, 1);
}


@Override
public void onCreate(SQLiteDatabase db) {
    //初始化表结构
db.execSQL(sql);
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {


}


}


自定义contentProvider

 public class MyProvider extends  ContentProvider{
DBOpenHelper helper;


@Override
public boolean onCreate() {
// TODO Auto-generated method stub
System.out.println("执行创建的方法");
helper = new DBOpenHelper(getContext());
return true;
}


@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
System.out.println("执行查询的方法");
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query(DBOpenHelper.myProvider_table_name, projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}


@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}


@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
System.out.println("执行插入的方法");
SQLiteDatabase db = helper.getWritableDatabase();
db.insert(DBOpenHelper.myProvider_table_name, null, values);
return null;
}


@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
System.out.println("执行删除的方法");
SQLiteDatabase db = helper.getWritableDatabase();
int id = db.delete(DBOpenHelper.myProvider_table_name, selection, selectionArgs);
if (id!=0) {
return id;
}
System.out.println(id+"");
return 0;
}


@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
System.out.println("执行更新的方法");
SQLiteDatabase db = helper.getWritableDatabase();
int count = db.update(DBOpenHelper.myProvider_table_name, values, selection, selectionArgs);
if (count != 0) {
return count;
}
return 0;
}


}

 public class MainActivity extends Activity {

        Uri uri ;
String AUTHORITY = "content://com.example.testdata.MyProvider/myProvider_table_name";
ContentResolver resolver;

  @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

                                uri = Uri.parse(AUTHORITY);
resolver = MainActivity.this.getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "小红");
// values.put("name", "小黄");
resolver.insert(uri, values);
Cursor cursor = resolver.query(uri, null, null, null, null);
System.out.println("数据集合大小为:"+cursor.getCount());
while (cursor.moveToNext()) {
int index = cursor.getColumnIndex("name");
System.out.println("想要获取的列index为:"+index);
System.out.println(cursor.getString(index));

}

}

}

如果想要在数据发生变化的时候就需要注册内容观察者,

步骤如下:使用contentResolver

ContentResolver resolver = getContentResolver();

resolver.registerContentObserver(uri, true, new MyObserver(new Handler()));

class MyObserver extends ContentObserver{


public MyObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
System.out.println("数据发生了变化");
}
}

第五种方式:网络存储

1 0
原创粉丝点击