Android开发实践 数据存储 学习、应用、总结
2016-05-21 15:26
831 查看
所有应用程序必然有数据的输入输出,Android也是一样的,Android应用程序的参数设置、运行状态数据这些都需要保存到外部存储器上,保证关机后数据不丢失,如下是几种Android常见的数据存储方式:
SharedPreferences:适合保存少量数据(一些配置信息、积分之类);
SQLite:一个真正轻量级数据库,没有后台进程,整个数据库就对应于一个文件,适合大量数据需要存储、访问的情况。
下来详细来看看它们的用法。
1)SharedPreferences接口
主要负责读取应用程序的Preferences数据,提供了如下常见方法来访问SharedPreferences中的key-value对:
SharedPreferences本身是一个接口,无法创建实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,mode参数支持如下几个值:
2)Editor
SharedPreferences接口本身没有写入数据的能力,而是通过SharedPreferences的内部接口,SharedPreferences调用edit()方法即获取Editor对象,Editor提供了如下方法写入数据:
3)SharedPreferences存储位置
SharedPreferences数据总是以xml格式保存在/data/data/package name/shared prefs目录下
读写其他应用的SharedPreferences需要获取其他程序所对应的Context
然后使用其他程序的Context获取对应的SharedPreferences实例,然后就可以类似上面进行读写数据了。
SQLiteDatabase表示一个数据库(底层是一个数据库文件),Android通过SQLiteDatabase对象来管理、操作数据库。
一般用法是创建SQLiteDatabaseHelper的子类并扩展它的onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法。
SQLiteDatabaseHelper包含如下常用方法:
然后就可以在XxxActivity中创建出数据库
接下来将增删改差封装起来,如下UserInfoDB:
到此我们就可以通过创建UserInfoDB实例,调用该实例的方法来增删改差数据库了
SharedPreferences:适合保存少量数据(一些配置信息、积分之类);
SQLite:一个真正轻量级数据库,没有后台进程,整个数据库就对应于一个文件,适合大量数据需要存储、访问的情况。
下来详细来看看它们的用法。
1.SharedPreferences
SharedPreferences保存的数据主要是简单类型的key-value对。1)SharedPreferences接口
主要负责读取应用程序的Preferences数据,提供了如下常见方法来访问SharedPreferences中的key-value对:
boolean contains(String key) // 判断是否包含key对应的数据 abstract Map<String, ?> getAll() // 获取全部key-value对 boolean getXxx(String key, xxx defValue) // 获取指定key的value值
SharedPreferences本身是一个接口,无法创建实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,mode参数支持如下几个值:
Context.MODE_PRIVATE // 私有,只能被本应用程序读写 Context.MODE_WORLD_READABLE // 能被其他应用程序读但不可写 Context.MODE_WORLD_WRITEABLE // 能被其他应用程序读写
2)Editor
SharedPreferences接口本身没有写入数据的能力,而是通过SharedPreferences的内部接口,SharedPreferences调用edit()方法即获取Editor对象,Editor提供了如下方法写入数据:
Editor clear() // 清空所有数据 Editor putXxx(String key, xxx value) // 存入指定key-value Editor remove(String key) // 删除指定key-value boolean commit() // 编辑完成后提交修改
3)SharedPreferences存储位置
SharedPreferences数据总是以xml格式保存在/data/data/package name/shared prefs目录下
2.SharedPreferences的用法
public class SharedPreferencesTest extends Activity { SharedPreferences sp; Editor editor; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sp = getSharedPreferences("config", MODE_PRIVATE); editor = sp.edit(); ... // 存入一个随机数 editor.putInt("random", (int) (Math.random() * 100)); editor.commit(); ... // 读取字符串数据 String text = sp.getString("text", "text"); } }
读写其他应用的SharedPreferences需要获取其他程序所对应的Context
uContext= createPackageContext("com.gc.other", Context.CONTEXT_IGNORE_SECURITY);
然后使用其他程序的Context获取对应的SharedPreferences实例,然后就可以类似上面进行读写数据了。
SharedPreferences sp = uContext.getSharedPreferences("uconfig",Context.MODE_WORLD_READABLE);
3.SQLite数据库
SQLite是一个嵌入式的数据库引擎,适用于资源有限的设备上适量存取数据(SQLite数据库只是一个文件)。SQLiteDatabase表示一个数据库(底层是一个数据库文件),Android通过SQLiteDatabase对象来管理、操作数据库。
4.SQLiteDatabaseHelper类
SQLiteDatabaseHelper是Android提供的一个管理数据库的工具类,可用于管理数据库的创建和版本更新。一般用法是创建SQLiteDatabaseHelper的子类并扩展它的onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法。
SQLiteDatabaseHelper包含如下常用方法:
getReadableDatabase() // 以读写的方式打开数据库对应的SQLiteDatabase对象 getWritableDatabase() // 以写的方式打开数据库对应的SQLiteDatabase对象 onCreate(SQLiteDatabase db) // 第一次创建回调 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) // 当数据库版本更新时回调 close() // 关闭所有打开的SQLiteDatabase
5.创建SQLite数据库
继承SQLiteOpenHelper,创建UserInfoSqliteOpenHelper数据库帮助类public class UserInfoSqliteOpenHelper extends SQLiteOpenHelper { public UserInfoSqliteOpenHelper(Context context) { /** * context 上下文 * name :数据库文件的名称 * factory:用来创建cursor对象的(默认null,一般在公司开发这里都指定null) * version:数据库的版本号(从1开始),如果发生改变会调用onUpgrade方法; * verison在Android4.0以下版本可以降级,在4.0及以上版本不能降级 */ super(context, "userinfo.db", null, 2); } /** * 数据库第一次创建时会调用(适合做表结构的初始化,需要执行sql语句,执行sql语句需使用SqliteDatabase数据库对象) */ @Override public void onCreate(SQLiteDatabase db) { //执行一个sql语句创建表 db.execSQL("create table info(id integer primary key autoincrement ,name varchar(20),email varchar(20)); } /** * 数据库版本升级时会调用该方法(适合做表结构的升级,需要执行sql语句) */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("alter table info add email varchar(11)"); } }
然后就可以在XxxActivity中创建出数据库
//创建一个数据库帮助类对象 UserInfoSqliteOpenHelper dbHelper = new UserInfoSqliteOpenHelper(this); //调用帮助类对象的getReadableDatabase()方法,帮助我们将数据库创建出来 SQLiteDatabase db = dbHelper.getReadableDatabase(); //SQLiteDatabase db = dbHelper.getWritableDatabase();
6.SQLite数据库的增删改查
首先创建用户实体类UserBeanpublic class UserBean { public int id; public String name; public String email; }
接下来将增删改差封装起来,如下UserInfoDB:
public class UserInfoDB { private UserInfoSqliteOpenHelper dbHelper; public UserInfoDB(Context context){ //创建一个数据库帮助类对象 dbHelper = new UserInfoSqliteOpenHelper(context); } /** * 增 */ public boolean add(UserBean bean){ /** * table:表名 * nullColumnHack: 可以为null,公司开发中一般传null. * values: 表中添加的一行的数据内容,ContentValues以Map封装 */ SQLiteDatabase db = dbHelper.getReadableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("name", bean.name); contentValues.put("email", bean.email); // 执行插入,返回值(如果插入成功将插入成功的行号返回,失败返回-1) long result = db.insert("info", "null", contentValues); // 内部在拼装sql语句 // 关闭数据库 db.close(); if(result == -1){ return false; }else{ return true; } } /** * 删 */ public int del(String name){ SQLiteDatabase db = dbHelper.getReadableDatabase(); /** * table:表名: * whereClause:删除条件 * whereArgs:删除条件占位符的参数 */ // 返回值是:成功删除了多少行 int result = db.delete("info", "name = ?", new String[]{name}); //关闭数据库 db.close(); return result; } /** * 改 */ public int update(UserBean bean){ SQLiteDatabase db = dbHelper.getReadableDatabase(); /** * table: 表名 * values:更改字段的内容,以map封装 * whereClause:更新条件 * whereArgs:更新条件占位符的参数 */ //sql:update info set email='100@126.com'where name='zhangsan'; ContentValues contentValues = new ContentValues(); contentValues.put("email", bean.email); //返回的值:成功修改了多少行 int result = db.update("info", contentValues, "name = ?", new String[]{bean.name}); //关闭数据库 db.close(); return result; } /** * 查 */ public void query(String name){ SQLiteDatabase db = dbHelper.getReadableDatabase(); /** * table:表名 * columns:查询的列名(如果null代表查询所有) * selection:查询条件 * selectionArgs:查询条件占位符的参数 * groupBy:以什么分组 * having:分组的条件 * orderBy:按哪个字段排序 */ Cursor cursor = db.query("info", new String[]{"id","name","email"}, "name = ?", new String[] {name}, null, null, "id desc"); /** * 判断结果集中是否有数据 */ if(cursor != null && cursor.getCount() >0){ //循环遍历结果集获取结果集的内容 while(cursor.moveToNext()){ //获取这一行上所有的数据内容 int id = cursor.getInt(0); String name2 = cursor.getString(1); String email = cursor.getString(2); System.out.println(id+":"+name2+":"+email); } } //关闭数据库 db.close(); } }
到此我们就可以通过创建UserInfoDB实例,调用该实例的方法来增删改差数据库了
UserInfoDB userInfoDB = new UserInfoDB(this); // 增 UserBean userBean = new UserBean(); userBean.name = "wangwu"; userBean.email = "900@126.com"; boolean result = userInfoDB.add(userBean); // 删 int num = userInfoDB.del("zhangsan"); Toast.makeText(mContext, "成功删除"+num+"行", 0).show(); // 改 UserBean userBean1 = new UserBean(); userBean1.name = "lisi"; userBean1.email = "200@126.com"; int num2 = userInfoDB.update(userBean1); Toast.makeText(mContext, "成功修改"+num2+"行", 0).show(); // 查 userInfoDB.query("wangwu");
相关文章推荐
- android图像处理(一)
- Android中实现定时器的3中方法
- Android获取本机IP地址,绝对可行
- Android Socket(简单的字符串)
- Android中drawable各个属性讲解
- Android Studio 报错:Your project path contains non-ASCII characters.
- [问题]mac执行adb命令出现adb: command not found解决方法
- Android Studio报错:Gradle DSL method not found: 'android()'
- ShareSDK-Android的使用总结
- Android 使用ViewGroup实现ViewPager的效果
- DataBinding简单操作
- 你需要知道的 Android6.0 权限相关
- Android Studio图文安装教程
- Android自动化测试框架---Espresso(2)
- Android源码之View的绘制
- Android开发获取相机拍照的原图(并非缩略图)
- android service
- Android新特性之二
- Android学习系列(8)--App反编译与代码混淆
- Android自动化测试框架---Espresso(1)