android存储数据的四种方式

Android提供以下四种存储方式:

  • SharePreference
  • SQLite
  • File
  • ContentProvider


一、Preferences


Preferences是一个较轻量级的存储数据的方法,具体使用方法:

在A中保存值:

SharedPreferences.Editor sharedata = getSharedPreferences("data", 0).edit();   

  sharedata.putString("name","shenrenkui");   

  sharedata.commit();  

在B中取值:

SharedPreferences sharedata = getSharedPreferences("data", 0);   

String data = sharedata.getString("name", null);   

Log.i(TAG,"data="+data);  

注意,Context.getSharedPreferences(String name,int type)的参数更我们在创建数据的时候的数据权限属性是一样的,存储和取值的过程这有点像HashMap但是比HashMap更具人性化,getXXX(Object key,Object defualtReturnValue),第二个参数是当你所要的key对应没有时候返回的值。这就省去了很多逻辑判断。。。。


二、Files

在Android上面没有的File就是J2se中的纯种File了,可见功能之强大,这里就算是走马观花地严重路过了。
//创建文件
            file = new File(FILE_PATH , FILE_NAME);
            file.createNewFile();
            
            //打开文件file的OutputStream
            out = new FileOutputStream(file);
            String infoToWrite = "纸上得来终觉浅,绝知此事要躬行";
            //将字符串转换成byte数组写入文件
            out.write(infoToWrite.getBytes());
            //关闭文件file的OutputStream
            out.close();
            
            //打开文件file的InputStream
            in = new FileInputStream(file);
            //将文件内容全部读入到byte数组
            int length = (int)file.length();
            byte[] temp = new byte[length];
            in.read(temp, 0, length);
            //将byte数组用UTF-8编码并存入display字符串中
            display =  EncodingUtils.getString(temp,TEXT_ENCODING);
            //关闭文件file的InputStream
            in.close();
        } catch (IOException e) {
            //将出错信息打印到Logcat
            Log.e(TAG, e.toString());
            this.finish();
        }
//从资源读取
InputStream is=getResources().getRawResource(R.raw.文件名)


三、Databases

SQLite是一个轻量级关系型数据库,既然是关系型数据库,那操作起来其实跟mysql、sql server差不多的。
需要注意的一点是,SQLite只有NULL、INTEGER、REAL(浮点数)、TEXT(字符串)和BLOB(大数据)五种类型,不存在BOOLEAN和DATE类型。
 
创建数据库
        通过openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)方法创建,如果库已创建,则打开数据库。
SQLiteDatabase db  = this.openOrCreateDatabase( "test_db.db", Context.MODE_PRIVATE, null);
创建表
        SQLiteDatabase没有提供创建表的方法,所以要靠execSQL()方法来实现。看名字也知道execSQL()用于直接执行sql的。
String sql="create table t_user (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL,password TEXT NOT NULL)";
db.execSQL(sql);
 
        使用SQLiteDatabase的insert(String table, String nullColumnHack, ContentValues values)方法插入数据。ContentValues 类,类似于java中的Map,以键值对的方式保存数据。
ContentValues values=new ContentValues();
values.put("name", "liangjh");
values.put("password", "123456");
db.insert("t_user", "id", values);
 
        删除数据就比较直接了。使用SQLiteDatabase的delete(String table, String whereClause, String[] whereArgs)实现。如果不想把参数写在whereArgs里面,可以直接把条件写在whereClause里面。
// 方式1 直接将条件写入到条件里面(个人觉得容易被注入,但其实数据都在客户端,没啥安全性可言)
db.delete("t_user", "id=1", null);
// 方式2 条件分开写,感觉比较安全
db.delete("t_user", "name=? and password =?", new String[]{"weiyg","112233"});

 

        查询有2个方法,query()和rawQuery()两个方法,区别在于query()是将sql里面的各参数提取出query()对应的参数中。可参考下面例子。
// 使用rawQuery
// Cursor c = db.rawQuery("select * from t_user", null);
// db.rawQuery("select * from t_user where id=1", null);
// db.rawQuery("select * from t_user where id=?", new String[]{"1"});
 
// 使用query()
Cursor c = db.query("t_user", new String[]{"id","name"}, "name=?", new String[]{"weiyg"}, null, null, null);
c.moveToFirst();
while(!c.isAfterLast()){
    String msg="";
    for(int i=0,j=c.getColumnCount();i<j;i++){
        msg+="--"+c.getString(i);
    }
    Log.v("SQLite", "data:"+msg);
    c.moveToNext();
}
 
        使用SQLiteDatabase的update(String table, ContentValues values, String whereClause, String[] whereArgs)可以修改数据。whereClause和whereArgs用于设置其条件。ContentValues对象为数据。
ContentValues values=new ContentValues();
values.put("password", "111111");
// 方式1 条件写在字符串内
db.update("t_user", values, "id=1", null);
// 方式2 条件和字符串分开
db.update("t_user", values, "name=? or password=?",new String[]{"weiyg","123456"});
 
其它

无论何时,打开的数据库,记得关闭。

db.close()

另外使用beginTransaction()和endTransaction()可以设置事务。


adb查看SQLite步骤:

1,  adb shell

2,  cd /data/data/com.android.providers.media/databases

3,  ls(查看com.android.providers.media下面的数据库)

4,  sqlite3 internal.db

5,  .help---看看如何操作

6,  .table列出internal数据中的表


 

四、contentprovider

注册ContentProvider
在AndroidManifest.xml中声明ContentProvider,authorities属性定义了ContentProvider的Uri标识。关于Uri标识属另一个范畴,自行查询。provider标识要放在<application></application>里面。如果遇到了"Permission Denial: opening provide..."的错误,可以试试在节点加“android:exported="true"”。
<application ...>
    ...
    <provider android:name=".MyProvider" android:authorities="com.example.androidtestdemo" android:exported="true"/>
</application>

 

在B程序获取数据
用Context获取到当前的ContentResolver,根据Uri地址和ContentResolver的query方法获取A程序的数据。Uri地址和A程序中AndroidManifest.xml定义的autorities要一致。当然,同类可以进行其它的操作。
复制代码
Context ctx=MainActivity.this;
ContentResolver resolver =ctx.getContentResolver();
Uri uri=Uri.parse("content://com.example.androidtestdemo");
Cursor c = resolver.query(uri, null, null, null, null);
c.moveToFirst();
while(!c.isAfterLast()){
    for(int i=0,j=c.getColumnCount();i<j;i++){
        Log.v("Android2",""+c.getString(i));
    }
    c.moveToNext();
}
复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值