Android开发 SQLite数据库应用笔记(一)
注意:
1.public Cursor rawQuery(String sql, String[] selectionArgs)
Cursor游标是查询后返回的结果集合,游标的意思是指向集合中的某行。
该函数返回的cursor游标的初始位置是在-1,即在第一组数据之前,此时不可获取数据,否则会报错:CursorIndexOutOfBoundsException: Index -1 requested。在调用Cursor.moveToFirst()后,游标位置为0,此时可以取数据。
如果返回结果包含0条,游标初始位置为-1,moveToFirst()后,游标位置为0,但此时取数据仍然会出错。所以在取是数据之前最好判断结果不为空。
2.SQL语句中字母大小写均可(竟然可以混搭!),但是要注意空格不能少。
3.数据库创建后默认存放地址和默认数据库读取地址是:/data/data/your_app_paket_name/databases
4.数据库从raw中拷贝到默认数据库地址,出现错误,只拷贝3KB。
要使用编辑好的数据库,需要将数据库放在raw中,拷贝到默认的文件夹,而经常出现的错误是,只拷贝了3KB!!
我们的代码经常是这样:
try {
if(!(new File(DBPath+"/"+DBName).exists())){
InputStream is = this.getResources().openRawResource(R.raw.schoolinfor);
FileOutputStream fos = new FileOutputStream(DBPath+"/"+DBName);
byte[] buffer = new byte[500];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.flush();
fos.close();
is.close();
}
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
这里有个错误,DBPath是"/data/data/paket_name/databases",而路径/dabases是在没有使用数据库相关API时是不存在的。在复制操作中缺少对路径/dabases的判断,会有两个可能的错误方向:
1.在这个复制操作之前,有用过数据库API,生产了一个空的数据库,其中只有android_metadata这个表,大小在3KB,这样在if语句中就不会去走复制操作的分支,而呈现给你的结果是,你只复制了3KB!而隐藏在背后的事实是:少年,这是一个错觉,你一点都没有复制!
2./dabases确实不存在,导致在FileOutputStream fos = new FileOutputStream(DBPath+"/"+DBName);操作中因为路径不存在,抛出异常,复制失败。
下面是修正后的代码,跑起来畅通无阻:
try {
if(!new File(DBPath).exists())
new File(DBPath).mkdirs();
if(!(new File(DBPath+"/"+DBName).exists())){
InputStream is = this.getResources().openRawResource(R.raw.schoolinfor);
FileOutputStream fos = new FileOutputStream(DBPath+"/"+DBName);
byte[] buffer = new byte[500];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.flush();
fos.close();
is.close();
}
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
copy DB from res/raw
Android开发 SQLite数据库应用笔记(一)的更多相关文章
- android开发--sqlite数据库
一.SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQL ...
- Android开发 ---SQLite数据库,lock文件,结果集游标,适配器,安全退出,给连接设置下划线,编辑器,投影,ContentValues存储,DbHelper,activity栈
目录截图: 1.activity_main.xml 主界面效果: <?xml version="1.0" encoding="utf-8"?> &l ...
- Android开发SQLite数据库的创建
package com.example.db; import android.content.Context; import android.database.sqlite.SQLiteDatabas ...
- Android实现SQLite数据库联系人列表
Android实现SQLite数据库联系人列表 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个通讯录查看程序: 要求使用SQLite ...
- windows phone 8.1开发SQlite数据库操作详解
原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...
- Qt for Android 打包 SQLite 数据库
Qt for Android 调用 SQLite 数据库时, 怎样将已经存在的数据库附加到 APK 中? 直接在你项目里面的Android源码的根目录下新建一个文件夹assets, 数据库就可以放里面 ...
- windows phone 8.1开发SQlite数据库引用安装
原文出自:http://www.bcmeng.com/windows-phone-sqlite/ windows phone 8.1开发SQlite数据库引用安装 第一步: 安装SQlite forw ...
- Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库
下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...
- android中sqlite数据库的基本使用和添加多张表
看了很多关于android使用sqlite数据库的文章,很多都是介绍了数据库的建立和表的建立,而表通常都是只建立一张,而实际情况我们用到的表可能不止一张,那这种情况下我们又该怎么办呢,好了,下面我教大 ...
随机推荐
- Java基本数据类型总结
基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型.它们是我们编程中使用最频繁的类型.java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化. 1. Java ...
- xml读取节点
<?xml version="1.0" encoding="utf-8"?> <tplcd type=" product=" ...
- No.11
每天干点杂活,充实自己,获得一种短暂的安全感......
- connect mysql from another host
vim /etc/mysql/my.cnf bind-address = 0.0.0.0 /etc/init.d/mysql restart mysql -uroot -p1234 # grant a ...
- 求一个区间[a,b]中数字1出现的次数
问题来源:http://ac.jobdu.com/problem.php?pid=1373 举例:如果n=10 那么1-10之间的1的个数是2(1,2,3,4,...10) 这其中有一个规律: 挨着看 ...
- Mybatis 总结
1.如何传递多个参数 mybatis中,如果接口有多个参数,那么在mapper.xml中,可以通过#{0,VARCHAR},#{1,VARCHAR}或#{param1,VARCHAR},#{param ...
- ecshop 不同页面调用不同分类文章的解决办法
调用文章列表,需要修改对应的程序,修改index.php或者arctical_cat.php文件在$smarty->assign('new_articles', index_get_new_ar ...
- [转]C/C++ 程序员必须收藏的资源大全
from: https://github.com/jobbole/awesome-cpp-cn C++ 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome – XXX 系列 ...
- 惊闻Java要收费之后
今天看到朋友圈里的文章 <Oracle终于要向Java的非付费用户开枪了>,被这个标题吓了一跳,还以为Java要全面收费了.又被标题党骗了. 但是仔细想想,以Oracle公司的尿性,没准哪 ...
- Linux创建定时任务
例如: 要求每天23:59分备份lampp日志: 备份的文件名以当时的时间命名 格式为:201612241852_acces.log 备份到:/tmp/logs/目录下 1.新建shell脚本:vim ...