安卓数据库操作放哪个线程
1. android在手机本地数据库读取数据属于耗时操作吗,用启动新线程吗
数据库操作建议不要写在UI里线程里,尤其是当数据量比较大时,这样比较容易引起ANR。所以建议启动新的线程里来处理数据库操作。
2. android操作sqlite数据库需要new一个新thread吗
不需要,如果sqlite查询很耗时的话可以使用thread异步查询。
SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLiteSQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。
Android 集成了 SQLite 数据库 Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。
数据库存储在 data/< 项目文件夹 >/databases/ 下。 Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库。
Android 提供了 SQLiteOpenHelper 创建一个数据库,只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。
SQLiteOpenHelper 的子类,至少需要实现三个方法:
1 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。
2 onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。
3 onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样就可以清楚如何把一个数据库从旧的模型转变到新的模型。
3. GreenDAO的数据库操作需要在子线程完成吗
当然是可以的,在线程里面会有很多程序,可以调用任何程序啊,这样调用的程序都在一个线程里完成的。在这个过程中当然也可以调用database类来完成对数据库的操作。
4. android 哪些操作需要在ui 线程中
anroid系统中UI线程负责向UI组件分发事件(包括绘制事件),并处理用户和应用之间交互。
做一些比较耗时的工作比如访问网络或者数据库查询,都会阻塞UI线程,导致事件停止分发(包括绘制事件)。对于用户来说,应用看起来像是卡住了,更坏的情况是,如果UI线程blocked的时间太长(大约超过5秒),用户就会看到ANR(application not responding)的对话框。
因此在ui线程做耗时非常短,不会发生阻塞的操作
5. 安卓 用多线程对同一数据库(SQL)进行读写操作 用什么方法
方法加同步锁,保证在同一个时间内只有一个人可以使用可以解决,具体可以参照http://www.blogjava.net/tscfengkui/archive/2010/11/10/337709.html?opt=admin 这个例子
6. android 数据库操作可以放在子线程里面吗
mysql是免费数据库,市场普及率非常高,而新建数据库就得一切从0来,收费还是不收费?编个新数据库技术并不难,难在数据库标准化机构是美国的,美国大嘴一张,整个数据库就得重改这里面的维护预算谁给出?
7. android sqlitedatabase 的操作是同步线程安全的吗
是的,默认的情况下,你可以把insert,update这些函数看作原子操作。可以参考这一篇
网页链接
但是你需要注意,你不能多次调用close函数,否则会产生异常。
8. android sqlite是在哪个线程商
其实在只使用一个SQLiteDatabase的引用时,SQLiteDatabase对CRUD操作都会加上一个锁(因为是db文件,所以精确至数据库级),这就保证了在同一时间你只能进行一项操作,无论是不是在同一个线程中,这就导致了如果你在程序中对SQLiteOpenHelper使用了单例模式,那么你对数据库读写进行任何的优化操作都是"徒劳"。
多线程读数据库
仔细看源码你会发现,在数据库操作中只有add,delete,update会调用lock(),而query()是不会调用的,但是在加载数据时,调用了SQLiteQuery的fillWindow方法,而该方法依然会调用SQLiteDatabase.lock(),所以要想真正的实现多线程读数据库,只能每个线程使用各自的SQLiteOpenHelper对象进行读操作,这样就可避开同步锁。关键源码如下: