Android数据存储总结 之二

连接上一篇: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,谢谢~~~~~~~~~~



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值