Android存储分为三类:学习笔记| AS入门(七) 数据存储篇 - 简书
一.文件存储
在Android中写入和读取文件的方法,Context类中提供了openFileInput()和openFileOutput()方法来打开数据文件里的文件IO流。openFileOutput的文件操作模式,可以为五种之一。
二.sp存储
SharePreferences是一种轻型的数据存储方式,常用来存储一些简单的配置信息,如int、string、boolean、float和long。它的本质是基于XML文件存储key-value键值对数据。
使用步骤:
(1)调用getSharedPreferences()方法获得SharedPreferences对象,提供两个参数,指定文件名和操作模式。
(2)调用SharedPreference对象的edit()方法获得SharedPreferences.Editor引用对象
(3)调用Edit接口的形如put某某某()方法以键值对形式保存某某某类型的数据
(4)调用Edit接口的commit()方法提交键值对。
三.sqlite数据可存储
SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,在存储大量复杂的关系型数据的时可以使用。
创建:第一步:自定义帮助类并继承SQLiteOpenHelper,并重写两个方法:onCreate()和 onUpgrade(),分别在这两个方法中去实现创建、升级数据库的逻辑。
第二步:实例化帮助类.
第三步:用帮助类对象的getReadableDatabase() 和getWritableDatabase()去创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库SQLiteDatabase。
第四步:进行增删改查操作:
增加操作insert(),三个参数含义(被操作的表名,空值字段的名称,数据即ContentValues对象),第二个参数一般传入null。
删除操作delete(),第一个参数还是表示表名,第二第三个参数用于约束删除某一行或几行的数据。
更新操作update() 方法提供四个参数,(表名,ContentValues对象,约束,约束)。
查询操作quary()需要至少七个参数(table, columns, selection, selectionArgs, groupBy, having, orderBy),含义是:(表名,要查询出的列名,查询条件子句,对应于selection语句中占位符的值,要分组的列名,分组后过滤条件,排序方式)。
数据库升级操作:MyHelper里需要重写的第二个方法onUpdate()用于帮助数据库进行版本更新。比如此刻需要在数据库再添加一张表course,只要在update()写好创建course的操作,然后想办法让它被调用就好了。还记得在实例化帮助类是需要传入的第四个参数版本号吗?之前的传入的是1,只要传入一个比1大的数就可以让update()执行了。
SQLite 仅仅支持 ALTER TABLE 语句的一部分功能,我们可以用 ALTER TABLE 语句来更改一个表的名字,也可向表中增加一个字段(列),但是我们不能删除一个已经存在的字段,或者更改一个已经存在的字段的名称、数据类型、限定符等等。
改变表名 - ALTER TABLE 旧表名 RENAME TO 新表名
增加一列 - ALTER TABLE 表名 ADD COLUMN 列名 数据类型
保证sqlit的原子性,处理高并发问题
使用Atomic Integer为android自带的自增长类和同步 synchronized来保证:
public class DatabaseManager{
private AtomicInteger mOpenCounter = new AtomicInteger();
private static DatabaseManager instance;
private static SQLiteOpenHelper mDatabaseHelper;
private SQLiteDatabase mDatabase;
public static synchronized void initializeInstance(SQLiteOpenHelper helper) {
if (instance == null) {
instance = new DatabaseManager();
mDatabaseHelper = helper;
}
}
public static synchronized DatabaseManager getInstance() {
if (instance == null) {
throw new IllegalStateException(DatabaseManager.class.getSimpleName() +
" is not initialized, call initializeInstance(..) method first.");
}
return instance;
}
public synchronized SQLiteDatabase openDatabase() {
if(mOpenCounter.incrementAndGet() == 1) {
// Opening new database
mDatabase = mDatabaseHelper.getWritableDatabase();
}
return mDatabase;
}
public synchronized void closeDatabase() {
if(mOpenCounter.decrementAndGet() == 0) {
// Closing database
mDatabase.close();
}
}
}
未完待续..............
网友评论