连接上一篇:Android数据存储总结之一
三、数据库保存
Android使用的数据库为SQLite,此数据库的特点是小巧,没有系统进程,只需要几百K的内存就可以跑起来,ISO和Android都使用的这个。数据库存储的数据类型有:
1、NULL,值是NULL
2、INTEGER,值是有符号整形,根据值的大小以1,2,3,4,6或8字节存放
3、REAL,值是浮点型值,以8字节IEEE浮点数存放
4、TEXT,值是文本字符串,使用数据库编码(UTF-8,UTF-16BE或者UTF-16LE)存放
5、BLOB,只是一个数据块,完全按照输入存放(即没有准换)
不过该类型不是刚性的,也就是说虽然可以指定数据类型,不过也可以存储不是指定类型的数据到里面。
Android有一个专门的类用来提供创建和操作数据库:sqliteOpenHelper
示例:
public class MySqliteOpenHelper extends SQLiteOpenHelper {
private String TAG = "MyDataBase";
private Context context;
private final String NAME = "";
private int VERSION = 1;
private String table_name = "";
private SQLiteDatabase db;
public MySqliteOpenHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
this.context = context;
this.VERSION = version;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.openOrCreateDatabase(NAME, null);
this.db = db;
}
// 执行sql语句,成功执行返回true
public boolean execSQl(String sql) {
boolean flag = false;
if (sql != null && sql.length() > 3) {
judgeDB();
db.execSQL(sql);
flag = true;
}
return flag;
}
// 添加数据
public void insert(String table, String hack, ContentValues values) {
judgeDB();
db.insert(table, hack, values);
close();
}
// 更新数据
public void update(String table, ContentValues values, String whereClause, String[] whereArgs) {
judgeDB();
db.update(table, values, whereClause, whereArgs);
close();
}
// 删除数据
public void delete(String table, String whereClause, String[] whereArgs) {
judgeDB();
db.delete(table, whereClause, whereArgs);
close();
}
// 查询数据
public Cursor select(String sql, String[] selectionArgs) {
judgeDB();
return db.rawQuery(sql, selectionArgs);
}
// 关闭数据库
public void close() {
if (db.isOpen())
db.close();
}
// 数据库是否处于打开状态,不处于就打开数据库
private void judgeDB() {
if (!db.isOpen())
db.openDatabase(NAME, null, SQLiteDatabase.OPEN_READWRITE);
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
Log.e(TAG, "数据库被打开了");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e(TAG, "表更新了");
// if (newVersion > oldVersion)
// db.execSQL("alter table " + NAME + " add ");
}
}
在执行增删改查操作的时候,可以直接使用SqliteDatabase封装好的方法,也可以使用sql命令去执行。四、网络保存
Android也可以把数据保存到服务器上面或者别的什么介质,比如自己搭建一个servlet服务器,然后使用http协议用post的方式把数据上传到服务器上面,再比如使用第三方的软件,如百度云、360网盘等把数据上传到别的公司的服务器上面。这种方式保存数据的优点就是存储容量可以说是无限大,缺点就是必须要有网络才能下载数据。
五、ContentProvider
1、编写一个类,继承ContentProvider类;
2、实现ContentProvider类中所有的抽象方法;
3、定义ContentProvider的Uri。这个Uri是ContentResolver对象执行CRUD(增删改查)操作时重要的参数;
4、使用UriMatcher对象映射Uri返回代码;
5、在AndroidMainfest.xml文件中使用<provider>标签注册ContentProvider。
ContentProvider类中六个抽象方法:
1、onCreate() 初始化provider
2、query() 返回数据给调用者
3、insert() 插入新数据到ContentProvider
4、update() 更新ContentProvider已经存在的数据
5、delete() 从ContentProvider中删除数据
6、getType() 返回ContentProvider数据的Mime类型
核心代码示例:
publicclass MyWordsProvider extends ContentProvider {
private MySQLiteOpenHelper dbHelper = null;
private SQLiteDatabase db = null;
privatestatic UriMatcher matcher = null;
privatestaticfinal String AUTHORITY = "com.xinxue.contentprovider";
static {
matcher = new UriMatcher(UriMatcher.NO_MATCH);
matcher.addURI(AUTHORITY, "words", 1);
matcher.addURI(AUTHORITY, "newwords", 2);
}
@Override
publicboolean onCreate() {
dbHelper = new MySQLiteOpenHelper(getContext());
db = dbHelper.getReadableDatabase();
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
switch (matcher.match(uri)) {
case 1:
Cursor cursor = db.query("tb_words", projection, selection,
selectionArgs, null, null, sortOrder);
return cursor;
case 2:
Cursor cursor2 = db.query("tb_newwords", projection, selection,
selectionArgs, null, null, sortOrder);
return cursor2;
default:
break;
}
returnnull;
}
@Override
public String getType(Uri uri) {
returnnull;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
long rowId = 0;
switch (matcher.match(uri)) {
case 1:
rowId = db.insert("tb_words", null, values);
if (rowId > 0) {
Uri newUri = ContentUris.withAppendedId(
Uri.parse("content://" + AUTHORITY + "/words"), rowId);
// 通知监听器,数据已经改变
getContext().getContentResolver().notifyChange(newUri, null);
return newUri;
}
break;
case 2:
rowId = db.insert("tb_newwords", null, values);
if (rowId > 0) {
Uri newUri = ContentUris.withAppendedId(
Uri.parse("content://" + AUTHORITY + "/newwords"),
rowId);
// 通知监听器,数据已经改变
getContext().getContentResolver().notifyChange(newUri, null);
return newUri;
}
break;
default:
break;
}
returnnull;
}
@Override
publicint delete(Uri uri, String selection, String[] selectionArgs) {
switch (matcher.match(uri)) {
case 1:
int count = db.delete("tb_words", selection, selectionArgs);
if (count > 0) {
// 通知监听器,数据已经改变
getContext().getContentResolver().notifyChange(uri, null);
}
return count;
case 2:
int count2 = db.delete("tb_newwords", selection, selectionArgs);
if (count2 > 0) {
// 通知监听器,数据已经改变
getContext().getContentResolver().notifyChange(uri, null);
}
return count2;
default:
break;
}
return 0;
}
@Override
publicint update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
switch (matcher.match(uri)) {
case 1:
int count = db.update("tb_words", values, selection, selectionArgs);
if (count > 0) {
// 通知监听器,数据已经改变
getContext().getContentResolver().notifyChange(uri, null);
}
return count;
case 2:
int count2 = db.update("tb_newwords", values, selection,
selectionArgs);
if (count2 > 0) {
// 通知监听器,数据已经改变
getContext().getContentResolver().notifyChange(uri, null);
}
return count2;
default:
break;
}
return 0;
}
}
扫描关注我的微信公众号:
到这里安卓数据存储的总结已经写完了,限于目前的水平,写的可能不是很清楚,中间大家有什么没弄明白的可以单独针对某个知识点深入学习一下,希望我写的这些知识能对你的学习有所帮助,文中有什么错误的地方欢迎指正,另外如果有什么建议也欢迎给我留言或者发我邮箱:leixinxue999@126.com,谢谢~~~~~~~~~~