一个三年Android开发的总结 - 常见数据库问题总结

Android应用开发离不开对SQLite数据库的操作,一般简单的增删改查,可以直接通过SQLiteDatabase进行,但是只要操作变得频繁,并且随着需求不断增加,你应该考虑使用ORM框架,至少使用SQLiteOpenHelper,结合需要用ContentProvider再封装一层。本文不介绍具体的使用方法,而是列出一些常见的问题,供分析参考。

使用问题

1.SQLiteOpenHelper 

(1)一个管理数据库连接的辅助类,缓存了已打开的数据库对象,提供了onConfigure onCreate onOpen,getReadableDatabase getWriteableDatabase方法;数据库文件不会直接创建,而是在调用getReadableDatabase或者getWriteableDatabase时才调用onConfigure等方法完成。在这个过程中会比较传入的数据库版本号,从而调用onDowngrade onUpgrade处理升级逻辑,默认的onDowngrade直接抛出异常。同时注意只有在版本号version等于0时,才会调用onCreate方法,所以数据库建表之类的操作可以在此方法中处理。 

2.ContentProvider 

ContentProvider封装后对外提供URI,内部既可以是对数据库的操作,也可以是文件甚至内存的操作。需要注意的是它提供的query delete等操作是在调用的线程中执行的,而非只在主线程。据我在Android4.X时的设备上统计,一般查询操作很快,在1ms左右,而单个的插入删除操作在10ms左右,如果希望界面流畅,在UI线程谨慎的修改数据库。

异常问题


  1. 数据库被锁异常 

2.android.database.CursorWindowAllocationException 

可能忽略的Java基础知识 - 理解内部类和匿名内部类,异常与异常捕获 有介绍。而如果是due to error后面跟-12表示内存消耗过多 具体数值和对应的原因如下所示

#define EPERM 1 /* Operation not permitted */#define ENOENT 2 /* No such file or directory */#define ESRCH 3 /* No such process */#define EINTR 4 /* Interrupted system call */#define EIO 5 /* I/O error */#define ENXIO 6 /* No such device or address */#define E2BIG 7 /* Argument list too long */#define ENOEXEC 8 /* Exec format error */#define EBADF 9 /* Bad file number */#define ECHILD 10 /* No child processes */#define EAGAIN 11 /* Try again */#define ENOMEM 12 /* Out of memory */#define EACCES 13 /* Permission denied */#define EFAULT 14 /* Bad address */#define ENOTBLK 15 /* Block device required */#define EBUSY 16 /* Device or resource busy */#define EEXIST 17 /* File exists */#define EXDEV 18 /* Cross-device link */#define ENODEV 19 /* No such device */#define ENOTDIR 20 /* Not a directory */#define EISDIR 21 /* Is a directory */#define EINVAL 22 /* Invalid argument */#define ENFILE 23 /* File table overflow */#define EMFILE 24 /* Too many open files */#define ENOTTY 25 /* Not a typewriter */#define ETXTBSY 26 /* Text file busy */#define EFBIG 27 /* File too large */#define ENOSPC 28 /* No space left on device */#define ESPIPE 29 /* Illegal seek */#define EROFS 30 /* Read-only file system */#define EMLINK 31 /* Too many links */#define EPIPE 32 /* Broken pipe */#define EDOM 33 /* Math argument out of domain of func */#define ERANGE 34 /* Math result not representable */

是在源码的errno-base.h中可以查到

3.android.database.sqlite.SQLiteDiskIOException  SQLite Result Codes 中查询具体的错误码即可 

这个计算的步骤如下: 

 SQLite Result Codes 中查询具体的原因

#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))

(266) SQLITE_IOERR_READThe SQLITE_IOERR_READ error code is an extended error code for SQLITE_IOERR indicating an I/O error in the VFS layer while trying to read from a file on disk. This error might result from a hardware malfunction or because a filesystem came unmounted while the file was open.

640?wx_fmt=png

版权声明:“并发编程网”所推送文章,除非确实无法确认,我们都会注明作者和来源。部分文章推送时未能与原作者取得联系。若涉及版权问题,烦请原作者联系我们,我们会在24小时内删除处理,谢谢!^_^15701189222

640?wx_fmt=jpeg
微信号:并发编程网
长按、关注
640?wx_fmt=png640?wx_fmt=jpeg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值