安卓五种数据存储的方式

使用SharedPreferences存储数据

 

1.适用范围:保存少量的数据,解锁口令密码等。

 

2.获取方法:

(1)调用Context对象的getSharedPreferences()方法,可被同一应用程序下的其他组件共享

(2)调用Activity对象的getPreferences()方法,只能在该Activity中使用

 

3.操作模式:

(1)Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容

(2)Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.

(3)Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.

(4)Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入

 

4.例子:

将数据保存至SharedPreferences:

SharedPreferencespreferences=getSharedPreferences("user",Context.MODE_PRIVATE);

Editoreditor=preferences.edit();

Stringname="xixi";

Stringage="22";

editor.putString("name",name);

editor.putString("age",age);

editor.commit();

 

从SharedPreferences获取数据:

SharedPreferences preferences=getSharedPreferences("user",Context.MODE_PRIVATE);

Stringname=preferences.getString("name", "defaultname");

Stringage=preferences.getString("age", "0");

 

 

 

使用文件存储数据

1.   适用范围:常用于存储大数量的数据

2.   使用方法:

(1)   存在本机

context.openFileOutput("filename",mode);写入文件
第一个参数:
文件的名称,不能包含路径分隔符“/”,如果文件不存在,Android会自动创建
创建的文件默认保存在/data/data/<package name>/files目录下
第二个参数:
Context.MODE_PRIVATE         //文件只能被本应用使用,新建模式
Context.MODE_APPEND          //追加模式
Context.MODE_WORLD_READABLE   //可以被其他应用读取
Context.MODE_WORLD_WRITEABLE  //可以被其他应用写入


context.openFileInput("filename");读取文件

 

例子:

public String read() {     //读文件

try {

    FileInputStream inStream = this.openFileInput("message.txt");

    byte[] buffer = new byte[1024];

    int hasRead = 0;

    StringBuilder sb = new StringBuilder();

    while ((hasRead = inStream.read(buffer)) != -1) {

         sb.append(new String(buffer, 0, hasRead));

      }

     inStream.close();

     return sb.toString();

      }catch (Exception e) {

          e.printStackTrace();

      }

     return null;

}   

public void write(String msg){      //写文件

     // 步骤1:获取输入值

     if(msg == null) return;

     try {

     // 步骤2:创建一个FileOutputStream对象,MODE_APPEND追加模式

      FileOutputStream fos =openFileOutput("message.txt",MODE_APPEND);

     // 步骤3:将获取过来的值放入文件

     fos.write(msg.getBytes());

     // 步骤4:关闭数据流

      fos.close();

 }catch (Exception e) {

      e.printStackTrace();

}

    }

(2)   存在SD

a、调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限,如下代码将返回true

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

b、调用Environment.getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录,或者使用"/mnt/sdcard/"目录

c、使用IO流操作SD卡上的文件

       注意,需要配置权限

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

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

      

       例子:

       //文件写操作函数

   private void write(String content) {

       if (Environment.getExternalStorageState().equals(

                Environment.MEDIA_MOUNTED)) {// 如果sdcard存在

           File file = new File(Environment.getExternalStorageDirectory()

                    .toString()

                    + File.separator

                    + DIR

                    + File.separator

                    + FILENAME); // 定义File类对象

           if (!file.getParentFile().exists()) { // 父文件夹不存在

                file.getParentFile().mkdirs();// 创建文件夹

           }

           PrintStream out = null; // 打印流对象用于输出

           try {

                out = new PrintStream(newFileOutputStream(file, true)); // 追加文件

                out.println(content);

           } catch (Exception e) {

                e.printStackTrace();

           } finally {

                if (out != null) {

                    out.close(); // 关闭打印流

                }

           }

       } else { // SDCard不存在,使用Toast提示用户

            Toast.makeText(this, "保存失败,SD卡不存在!", Toast.LENGTH_LONG).show();

        }

    }

 

    // 文件读操作函数

   private String read() {

       if (Environment.getExternalStorageState().equals(

                Environment.MEDIA_MOUNTED)) {// 如果sdcard存在

           File file = new File(Environment.getExternalStorageDirectory()

                    .toString()

                    + File.separator

                    + DIR

                    + File.separator

                    + FILENAME); // 定义File类对象

           if (!file.getParentFile().exists()) { // 父文件夹不存在

                file.getParentFile().mkdirs();// 创建文件夹

           }

           Scanner scan = null; // 扫描输入

           StringBuilder sb = new StringBuilder();

           try {

                scan = new Scanner(newFileInputStream(file)); // 实例化Scanner

                while (scan.hasNext()) { // 循环读取

                    sb.append(scan.next() +"\n"); // 设置文本

                }

                return sb.toString();

           } catch (Exception e) {

                e.printStackTrace();

           } finally {

                if (scan != null) {

                    scan.close(); // 关闭打印流

                }

           }

       } else { // SDCard不存在,使用Toast提示用户

           Toast.makeText(this, "读取失败,SD卡不存在!", Toast.LENGTH_LONG).show();

       }

       return null;

    }

 

 

SQLite存储数据

1.   特点:

轻量级嵌入式数据库引擎,它支持SQL 语言,并且只利用很少的内存就有很好的性能。我们可以使用SQLite来存储我们大量的数据

 

2.   使用:

SQLite支持SQL语言,所以不管是增删改查都可以用SQL语句完成,即db.execSQL(sql语句),我们还可以使用他们各自的方法:

(1)  增

(long)insert(Stringtable,String nullColumnHack,ContentValues values)

例子:

//实例化一个ContentValues用来装载待插入的数据

ContentValuescv = new ContentValues();

cv.put("username","JackJohnson");//添加用户名

cv.put("password","iLovePopMusic");//添加密码

db.insert("user",null,cv);//执行插入操作

(2)  删

(int)delete(Stringtable,String whereClause,String[] whereArgs)

例子:

StringwhereClause = "username=?";//删除的条件

String[]whereArgs = {"Jack Johnson"};//删除的条件参数

db.delete("user",whereClause,whereArgs);//执行删除

(3)  改

(int)update(String table, ContentValues values, StringwhereClause, String[] whereArgs)

例子:

ContentValuescv = new ContentValues();//实例化ContentValues

cv.put("password","iHatePopMusic");//添加要更改的字段及内容

StringwhereClause = "username=?";//修改条件

String[]whereArgs = {"Jack Johnson"};//修改条件的参数

db.update("user",cv,whereClause,whereArgs);//执行修改

(4)  查

(Cursor) query(String table, String[] columns, Stringselection, String[] selectionArgs, String groupBy, String having, StringorderBy, String limit)

(Cursor) rawQuery(String sql, String[] selectionArgs)

例子:

Cursorc = db.query("user",null,null,null,null,null,null);

//查询并获得游标

if(c.moveToFirst()){//判断游标是否为空

    for(int i=0;i<c.getCount();i++){

        c.move(i);//移动到指定记录

        Stringusername = c.getString(c.getColumnIndex("username");

        Stringpassword = c.getString(c.getColumnIndex("password"));

    }

}

 

通过rawQuery实现的带参数查询

Cursor c =db.rawQuery("select * from user whereusername=?",new Stirng[]{"Jack Johnson"});

if(cursor.moveToFirst()) {

    Stringpassword = c.getString(c.getColumnIndex("password"));

}

 

 

 

 

使用ContentProvider存储数据

1.   特点:

ContentProvider为存储和获取数据提供了统一的接口。使用ContentProvider可以在不同的应用程序之间共享数据。 

 

2.   使用

(1)    定义一个COTENT_URI常量

  一个查询URI是由"scheme"、"authority"、"path"组成,还有一个可选择的"id"部分,带有id的URI对应了表格中的某一行。"scheme"一般指定为"content";为了各个Provider之间不产生冲突,"authority"推荐使用应用程序的包名,例如例子中使用的是"com.ns.note";"path"设置成表格名称即可。

关于URI和UriMatcher的详解可参考此篇文章:

http://blog.csdn.net/feng88724/article/details/6331396

(2)定义一个类,继承ContentProvider
(3)实现query(),delete(),update(),insert(),onCreate(),getType()方法
(4)在AndroidMainfest.xml中申明

       <provider 

   android:name="com.example.cptest.FirstContentProvider" 

   android:authorities="com.example.cptest.FirstContentProvider" 

/> 

 

3.   例子:较长,不在这里列出,详情可见下面博客

https://liuzhichao.com/p/562.html

 

网络存储数据

 

不做赘述,注意添加权限

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值