android 数据库学习总结

学习来自郭大侠的博客

只记录下 学习时遇到的问题  温习去看他的博客

第一篇 基本就是 用cmd adb shell 命令来 进行 数据库的展示

我用的是真机 这里就遭遇了root 以及 sqlite3 的问题

首先是adb shell 没有出现#号 超级用户标识 输入 su 或者 su root 提示permission deny  

拿到 root 我采用了  刷机精灵 一键root 的方式 

接下来就是 sqlite3不存在的问题  有的手机   system/xbin 下 是没有该 sqlite3文件的  需要借助 真机对应的基带版本 例如 4.0.3 就需要 创建  4.0.3 的 android 模拟器 在ddms 中的fileExplorer 下 找到对应的sqlite3 然后 pull 到桌面 然后 再 从桌面push到 真机的 sdcard下 然后执行 复制命令  具体操作   详情 请看  http://blog.csdn.net/leon90dm/article/details/8913180

由于我缺少 对应 版本的  intel x86/ARM system image 无法创建出对应的 模拟器 我用了 不同android 版本的 sqlite3 虽然没有出现 作者所说的 cannot locate 'sqlite3_enable_load_extensions

但是 在 执行 sqlite3 xx.db 时 出现了 

[1]+stopped (signal) sqlite3  xx.db 

搜索stackoverflow  有相类似问题解答 http://stackoverflow.com/questions/3645319/why-do-i-get-a-sqlite3-not-found-error-on-a-rooted-nexus-one-when-i-try-to-op

但都都不是我的问题 我尝试用4.1.2 的三星  galaxy note i9220 却出现了 register_localized_collators failed 疯了 

用了模拟器 什么问题都没有了 真机 暂时 用 rootExplorer + rooter软件  进行库表数据的查看吧

委屈



好吧 进入下一篇吧 好读书 不求甚解 

=========================================

第二篇 就是介绍如何 引入litepal 以及相关配置工作 以及如何建表

=========================================

第三篇  数据库的升级 库表的增加 表字段的增加 

使用litepal框架固然简单 但是原有的逻辑思路还是应该记得

每当版本号增加的时候就会调用onUpgrade()方法  根据版本号加入具体的升级逻辑  如果是从旧版本升级过来的呢?也没有问题,我们在onUpgrade()方法中已经把升级逻辑都处理好了,当oldVersion等于2的时候,会执行alter语句来添加publishdate这一列。现在调用以下代码来创建或升级数据库:

public class MySQLiteHelper extends SQLiteOpenHelper {

	......

	public static final String CREATE_COMMENT = "create table comment ("
			+ "id integer primary key autoincrement, " 
			+ "content text, " 
			+ "publishdate integer)";

	......

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		switch (oldVersion) {
		case 1:
			db.execSQL(CREATE_COMMENT);
			break;
		case 2:
			db.execSQL("alter table comment add column publishdate integer");
			break;
		default:
		}
	}

}

现在调用以下代码来创建或升级数据库:

SQLiteOpenHelper dbHelper = new MySQLiteHelper(this, "demo.db", null, 3);
SQLiteDatabase db = dbHelper.getWritableDatabase();
===============================================
第四篇 主要讲 如何实现表与表之间的关联  一对一 一对多 多对多  常见的就是 一对多 

即一对一关联的实现方式是用外键,多对一关联的实现方式也是用外键,外键在多的一方,多对多关联的实现方式是用中间表


=====================================

第五篇 数据库的存储操作

 传统的是insert方法   litepal 对应的方法名  是 save() 

除了  new 出一个对象  然后 对象.save()外

其中还提到了几个我并没有常使用的方法 saveThrow \ saveAll

save()方法返回的是一个布尔值,用于表示存储成功还是失败,但同时也说明这个方法是不会抛出异常的。有些朋友希望如果存储失败的话就抛出异常,而不是返回一个false,那就可以使用saveThrows()方法来代替 ,使用saveThrows()方法来存储数据,一旦存储失败就会抛出一个DataSupportException异常,我们可以通过对这个异常进行捕获来处理存储失败的情况。

saveAll()方法接收一个Collection集合参数,只要把待存储的集合数据传入即可。这个方法可以完成和上面一段代码完全一样的功能,但效率却会高得多,而且写法也更加简单。

========================================

第六篇 数据库的修改 删除

我们想把news表中标题为“今日iPhone6发布”且评论数量大于0的所有新闻的标题改成“今日iPhone6 Plus发布”,就可以这样写

ContentValues values = new ContentValues();
values.put("title", "今日iPhone6 Plus发布");
DataSupport.updateAll(News.class, values, "title = ? and commentcount > ?", "今日iPhone6发布", "0");

但是这种用法有一点需要注意,就是如果我们想把某一条数据修改成默认值,比如说将评论数修改成0,只是调用updateNews.setCommentCount(0)这样是不能修改成功的,因为即使不调用这行代码,commentCount的值也默认是0。所以如果想要将某一列的数据修改成默认值的话,还需要借助setToDefault()方法。用法也很简单,在setToDefault()方法中传入要修改的字段名就可以了(类中的字段名),比如说我们想要把news表中所有新闻的评论数清零,就可以这样写:

News updateNews = new News();
updateNews.setToDefault("commentCount");
updateNews.updateAll();

========================================

第七篇 数据库的查询

传统查询

SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("news", null, "commentcount>?", new String[]{"0"}, null, null, null);

List<News> newsList = new ArrayList<News>();
if (cursor != null && cursor.moveToFirst()) {
	do {
		int id = cursor.getInt(cursor.getColumnIndex("id"));
		String title = cursor.getString(cursor.getColumnIndex("title"));
		String content = cursor.getString(cursor.getColumnIndex("content"));
		Date publishDate = new Date(cursor.getLong(cursor.getColumnIndex("publishdate")));
		int commentCount = cursor.getInt(cursor.getColumnIndex("commentcount"));
		News news = new News();
		news.setId(id);
		news.setTitle(title);
		news.setContent(content);
		news.setPublishDate(publishDate);
		news.setCommentCount(commentCount);
		newsList.add(news);
	} while (cursor.moveToNext());
}<pre name="code" class="html">

 

News firstNews = DataSupport.findFirst(News.class);
News lastNews = DataSupport.findLast(News.class);

List<News> newsList = DataSupport.findAll(News.class, 1, 3, 5, 7);

<pre name="code" class="html">long[] ids = new long[] { 1, 3, 5, 7 };
List<News> newsList = DataSupport.findAll(News.class, ids);

 

List<News> newsList = DataSupport.select("title", "content")
		.where("commentcount > ?", "0").find(News.class);

List<News> newsList = DataSupport.select("title", "content")
		.where("commentcount > ?", "0")
		.order("publishdate desc").limit(10).offset(10)
		.find(News.class);

原生查询

Cursor cursor = DataSupport.findBySQL("select * from news where commentcount>?", "0");

=================================

第八篇 聚合函数 对我来说 比较陌生

count() 行数

int result = DataSupport.where("commentcount = ?", "0").count(News.class);
sum()方法主要是用于对结果进行求合的,比如说我们想要统计news表中评论的总数量

int result = DataSupport.sum(News.class, "commentcount", int.class);

sum()方法的参数要稍微多一点,我们来一一看下。第一个参数很简单,还是传入的Class,用于指定去统计哪张表当中的数据。第二个参数是列名,表示我们希望对哪一个列中的数据进行求合。第三个参数用于指定结果的类型,这里我们指定成int型,因此返回结果也是int型。

需要注意的是,sum()方法只能对具有运算能力的列进行求合,比如说整型列或者浮点型列,如果你传入一个字符串类型的列去求合,肯定是得不到任何结果的,这时只会返回一个0作为结果。


average()方法主要是用于统计平均数的,比如说我们想要统计news表中平均每条新闻有多少评论,就可以这样写:

double result = DataSupport.average(News.class, "commentcount");
max()方法主要用于求出某个列中最大的数值

int result = DataSupport.max(News.class, "commentcount", int.class);
min()方法主要用于求出某个列中最小的数值

int result = DataSupport.min(News.class, "commentcount", int.class);

综上所说  都是 litepal的如何使用  处于使用层次 

=======================================

待增加---






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值