第一篇 基本就是 用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下 然后执行 复制命令 具体操作 详情 请看
由于我缺少 对应 版本的 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的如何使用 处于使用层次
=======================================
待增加---