Andorid提高--数据持久化

        对于数据的存储和访问是android的很重要的一块内容,比如参数的保存,文件的访问,数据库的存储和访问,对内容提供者的建立和访问等等。

这里我们就对下面的这些存储方式进行一下剖析:

------------------------------------------------------------------------------------------------

1) sharedpreferences
         应用场景:保存简单、少量的键值对数据,一般用作应用参数的保存
         实现:XML文件
         好处:比自己写代码更简单

看一段保存数据的代码:

//得到一个实现Editor接口的对象,文件模式为private模式,表示只有当前应用可以访问并且新的文件内容会覆盖旧的文件内容

  SharedPreferences.Editor editor = getSharedPreferences("test",MODE_PRIVATE).edit();
  //在文件中加入键值对 text为键 内容为hello 当前内容在内存中 且存在于editor对象中
   editor.putString("text", "hello");

//把内容提交给preference对象 对数据进行保存 文件保存在data/data/包名/shared_prefs中 文件名没加后缀 因为系统自动会给文件补加.xml

   editor.commit();

下面是一段读取内容的代码:

//得到preference对象

   SharedPreferences prefs = getSharedPreferences("test", MODE_PRIVATE);
//得到text键对应的内容
   String restoredText = prefs.getString("text", null);

//可以把内容赋值给一个textview组建进行显示
   if (restoredText != null) {
   mSaved.setText(restoredText, TextView.BufferType.EDITABLE);

2) 应用程序内的数据保存
     非键值对格式、或者自定义格式、数组字符串等
     相对少量的字符串
     例如:{”asfas“, "asfasfd", "132123"}

//打开一个输出流 如果文件不存在 系统会自动创建

FileOutputStream openFileOutput = openFileOutput("test.txt", MODE_APPEND);

//这里用了通用的字符流读写方式 把"test"转换为byte写入文件中
          openFileOutput.write("test".getBytes());
 

文件的读取:

//打开一个输入流连接到test.txt文件上
          FileInputStream openFileInput = openFileInput("test.txt");

//创建一个字节数组输出流 把文件读取的内容先暂时存到内存中
          ByteArrayOutputStream stream = new ByteArrayOutputStream();

//创建一个1k的缓冲
          byte[] buffer = new byte[1024];
          int length = -1;

//判断是否读到了文件的末尾
          while ((length  = openFileInput.read(buffer)) != -1){

//由于文件最后的读入不一定是1024,所以用参数length来保证
                        stream.write(buffer, 0, length);
                    }   

//把字节流转换为字符串                
                    String str = stream.toString();
 

3)External store SD卡
         场景:较大或者大量的文件
         例如:极品飞车、实况足球等大型游戏,
                  数据包安装到SD卡上,节省内存空间。
         缺点:读取速度相对内存较慢,以时间换空间
         SDCard路径:      "/mnt/sdcard/test.txt"

读写方式和应用程序内的数据类似

"/mnt/sdcard/"的目录可以用Environment.getExternalStorageDirectory()得到

File file = new File(Environment.getExternalStorageDirectory(), filename);

但是需要注意添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 4) 数据库SQLite
         在Android中使用数据库的场景:
               有大量相同类型数据需要增删改查
               a) 联系人、短信、多媒体等系统应用
               b) 管理类应用,比如Launcher、SoftMarket

SQLite步骤:
         a) 声明一个类,继承SQLiteOpenHelper
         b) 覆写onCreate()/onUpgrade()/构造方法
           public XXXSQLiteHelper(Context context){
                super(context, "test.db", null, 1);

            }
         c) 创建数据库辅助类的实例(new XXXSQLiteHelper())
         d) 通过helper.getWritableDatabase()获取数据库访问实例
         e) 用SQLiteDatabase的execSQL()方法实现增删改
            用rawQuery()方法实现查询                 
创建表:

String sql = "CREATE TABLE person (personid integer primary key autoincrement, name varchar(20), phone VARCHAR(12) NULL)"        

db.execSQL(sql);


插入语句:

SQLiteDatabase db = mDBHelper.getWritableDatabase(); 

db.execSQL("insert into person(name, phone) values(?, ?)", new String[]{"tom", "13812312312"});

升级表
db.execSQL("ALTER TABLE person ADD salary VARCHAR(12) NULL");

插入数据
        SQLiteDatabase db = mHelper.getWritableDatabase();
        db.execSQL("insert into person(name, phone) values(?, ?)", new String[]
        {"tom", "13812312312"});

查询数据
        SQLiteDatabase db = mHelper.getWritableDatabase();
        Cursor cursor = db.rawQuery("select * from person where personid=?", new String[]
        {"1"});
        if (cursor.moveToFirst())
        {
            int personid1 = cursor.getInt(cursor.getColumnIndex("personid"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String phone = cursor.getString(cursor.getColumnIndex("phone"));
            System.out.println();
        }

更新数据
        db.execSQL("update person set name=?, phone=? where personid=?", new Object[]
        {"tom", "18675510130", 1});

删除数据

"delete from person where personid=?", new Object[]{1}

本文出自 “安卓笔记” 博客,转载请与作者联系!

你可能感兴趣的:(sqlite,职场,休闲,数据持久化)