在本文中,您将会了解到关于如何在Android中使用SQLite实现最佳性能?的新资讯,并给出一些关于android–如何在SQLite中使用FTS3、Android个人理财工具二:使用SQLite实
在本文中,您将会了解到关于如何在Android中使用SQLite实现最佳性能?的新资讯,并给出一些关于android – 如何在SQLite中使用FTS3、Android 个人理财工具二:使用SQLite实现启动时初始化数据、Android 用SQLite实现事务的方法、Android中使用SQLite3 命令行查看内嵌数据库的方法的实用技巧。
本文目录一览:- 如何在Android中使用SQLite实现最佳性能?
- android – 如何在SQLite中使用FTS3
- Android 个人理财工具二:使用SQLite实现启动时初始化数据
- Android 用SQLite实现事务的方法
- Android中使用SQLite3 命令行查看内嵌数据库的方法
如何在Android中使用SQLite实现最佳性能?
>似乎使用批量插入的事务比在循环中这样做要快一些.
怎么来的?使用sqlite时最好的方法是什么? sqlite在Android上如何工作?
>使用InserHelper与ContentValues混淆,如here所示.
InserHelper如何工作,总是会比ContentValues快吗?会以交易速度加快吗?
>混淆其他sql框架.我记得添加索引会提高与索引相关的查询的性能.这对Android来说也是如此吗?这是一个好习惯吗?
>我听说在某些情况下,最好不要使用UI线程进行数据库操作.在这种情况下是否推荐?如何,DB操作有多慢?如果DB变为70MB,是否意味着它会慢得多,UI线程永远不会处理它?
解决方法
how come?
事务涉及磁盘I / O.做一个更大的磁盘I / O块比大量的磁盘I / O要少得多.
how does the InserHelper work and will it always be faster than contentValues?
引用the documentation:“这个类允许用户对表进行多个插入,但是只能编译一次sql插入语句,这可能会提高性能.
will wrapping it with a transaction speed it even further ?
大概是的
is it true for android too ?
索引可以提高查询速度,如果您为任何正在执行的查询创建正确的索引.索引总是减少插入/更新/删除速度,因为现在这些索引需要更新.这与Android无关.
is is a good thing to use ?
这是不可能在抽象中回答的.这与Android无关.
it’s best to not use the UI thread for DB operations
正确.
in which cases will it be recommended ?
绝对不要在主应用程序线程上执行任何磁盘I / O.
how slow Could DB operation become ?
世纪.可能到那时,设备会出现故障,否则会耗尽电池电量.
if the DB becomes 70MB,does it mean that it will be much slower
这取决于你用它做什么
and UI thread should never handle it ?
正确.
android – 如何在SQLite中使用FTS3
我有几乎200k条目的表.当我尝试用LIKE搜索时,它非常慢.现在我决定使用FTS.所以我创建了两个索引来进行搜索.然后我创建了fts虚拟表.
`CREATE TABLE [search_eng] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT,
[entry_id] INTEGER,
[re_value] TEXT,
[ke_value] TEXT,
[g_value] TEXT);
CREATE INDEX idx_se_re ON search_eng (re_value);
CREATE INDEX idx_se_gv ON search_eng (g_value);
CREATE VIRTUAL TABLE search_eng_fts USING fts3(id, entry_id, re_value, ke_value, g_value);`
我不知道如何使用新创建的FTS表.所以我的问题是如何使用该虚拟表进行搜索?能给我举个例子吗?
解决方法:
这在the documentation中解释.
FTS搜索不需要两个索引.
您应该将id列声明为INTEGER PRIMARY KEY.
您可能不需要FST表中的entry_id列.
将文本复制到FTS表中:
INSERT INTO search_eng_fts(id, re_value, ke_value, g_value)
SELECT id, re_value, ke_value, g_value FROM search_eng;
然后,您可以使用MATCH运算符在该表中进行搜索:
SELECT id FROM search_eng_fts WHERE re_value MATCH 'hello';
Android 个人理财工具二:使用SQLite实现启动时初始化数据
关于sqlite
sqlite是嵌入式sql数据库引擎sqlite(sqlite Embeddable sql Database Engine)的一个扩展。sqlite是一个实现嵌入式sql数据库引擎小型C语言库(C library),实现了独立的,可嵌入的,零配置的sql数据库引擎。特性包括:事务操作是原子,一致,孤立,并且持久的,即使在系统崩溃和电源故障之后。 零配置――不需要安装和管理。 实现了绝大多数sql92标准。
我在多年前就关注sqlite的发展,非常看好sqlite的前景,因为在移动、嵌入式的应用里面,sqlite具有非常好的特性来满足需求。
早在symbian 9.0 之前,openc 出来后,我就研究sqlite到symbian的移植。后来symbian9.3 nokia就已经集成了sqlite。
至今j2me还不支持sqlite,可以说是个遗憾。
现在我们来看看android sqlitedatabase 包里面的关键api:
Java代码
static sqliteDatabase openorCreateDatabase(String path,sqliteDatabase.CursorFactory factory) //打开数据库 Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit) //执行查询sql void execsql(String sql) //执行非查询sql
sdk 1.0 关于cursor和sqlite的相关api对于前面的版本改变很多。
我觉得关键是没了query(String sql)这个简单的方法了,很不爽。
不过如果你对新的query方法了解深入点,发现其实也就一样。
实例代码
我们来看两个例子。
Java代码
//执行select type,name from sqlite_master where name='colaconfig' String col[] = {"type","name" }; Cursor c =db.query("sqlite_master",col,"name='colaconfig'",null,null); int n=c.getCount(); //执行多表查询 //select fee,desc from acctite a,bills b where a.id=b.id String col2[] = {"fee","desc" }; Cursor c2 =db.query("acctitem a,bills b","a.id=b.id",null); int n2=c2.getCount(); Log.v("cola","c2.getCount="+n2+""); c2.movetoFirst(); int k = 0; while(!c2.isAfterLast()){ String ss = c2.getString(0) +","+ c2.getString(1); c2.movetoNext(); Log.v("cola","ss="+ss+""); }
现在来看看我们如何在这个理财工具里面应用它。
我们需要在程序的第一次启动时,创建数据库,然后把基本的表创建好,并且初始化好账目表。
对于上一篇中的initapp方法,我们需要改造成:
Java代码
public void initApp(){ BilldbHelper billdb=new BilldbHelper(this); billdb.FirstStart(); billdb.close(); }
下面我们给出BilldbHelper.java 代码:
Java代码
package com.cola.ui; import android.content.Context; import android.database.Cursor; import android.database.sqlite.sqliteDatabase; import android.util.Log; /** * Provides access to a database of notes. Each note has a title,the note * itself,a creation date and a modified data. */ public class BilldbHelper { private static final String TAG = "Cola_BilldbHelper"; private static final String DATABASE_NAME = "cola.db"; sqliteDatabase db; Context context; BilldbHelper(Context _context) { context=_context; db=context.openorCreateDatabase(DATABASE_NAME,null); //创建数据库 Log.v(TAG,"db path="+db.getPath()); } public void CreateTable_acctitem() { try{ db.execsql("CREATE TABLE acctitem (" //创建账目表 + "ID INTEGER PRIMARY KEY," + "PID integer," + "NAME TEXT," + "TYPE INTEGER" + ");"); Log.v("cola","Create Table acctitem ok"); }catch(Exception e){ Log.v("cola","Create Table acctitem err,table exists."); } } public void CreateTable_bills() { try{ db.execsql("CREATE TABLE bills (" + "ID INTEGER PRIMARY KEY," + "fee integer," + "userid integer," + "sdate TEXT," + "stime TEXT," + "desc TEXT" + ");"); Log.v("cola",table exists."); } } public void CreateTable_colaconfig() { try{ db.execsql("CREATE TABLE colaconfig (" + "ID INTEGER PRIMARY KEY," + "NAME TEXT" + ");"); Log.v("cola","Create Table colaconfig ok"); }catch(Exception e){ Log.v("cola",table exists."); } } public void Initacctitem() { db.execsql("insert into acctitem values (100,'收入',0)"); db.execsql("insert into acctitem values (100100,100,'工资',0)"); db.execsql("insert into acctitem values (200,'支出',1)"); db.execsql("insert into acctitem values (200100,200,'生活用品',1)"); db.execsql("insert into acctitem values (200101,'水电煤气费',1)"); db.execsql("insert into acctitem values (200103,'汽油费',1)"); Log.v("cola","insert into ok"); } public void QueryTable_acctitem(){ } public void FirstStart(){ //如果是第一次启动,就不存在colaconfig这张表. try{ String col[] = {"type",null); int n=c.getCount(); if (c.getCount()==0){ CreateTable_acctitem(); CreateTable_colaconfig(); CreateTable_bills(); Initacctitem(); } Log.v("cola","c.getCount="+n+""); }catch(Exception e){ Log.v("cola","e="+e.getMessage()); } } public void close(){ db.close(); } }
系列文章:
Android 个人理财工具六:显示账单明细 下
Android 个人理财工具五:显示账单明细 上
Android 个人理财工具四:添加账单页面 下
Android 个人理财工具三:添加账单页面 上
Android 个人理财工具二:使用SQLite实现启动时初始化数据
Android 个人理财工具一:项目概述与启动界面的实现
以上就是对Android sql的讲解及实例,后续继续做个人理财项目,谢谢大家支持!
Android 用SQLite实现事务的方法
public void payment() {
sqliteDatabase db = dbOpenHelper.getReadableDatabase();
db.beginTransaction();//开始事务
try {
db.execsql("update person set amount=amount-10 where personid=2");
db.execsql("update person set amount=amount+10 where personid=5");
db.setTransactionSuccessful();// 设置事务的标志为true,调用此方法会在执行到endTransaction()方法是提交事务,若没有调用此方法会在执行到endTransaction()方法回滚事务。
} catch (sqlException e) {
} finally {
db.endTransaction();
}
// 结束事务,有两种情况:commit,rollback,
// 事务的提交或回滚是由事务的标志决定的,如果事务的标志为true就会提交,否则回滚,默认情况下事务的标志为false
}
PS:类似转账功能,两个操作在同一个事务中完成。
Android中使用SQLite3 命令行查看内嵌数据库的方法
在上图中,除了最后一个红色的方框,其它方框都是adb shell下的命令。
【1】在Android程序中,一般创建的数据库存放在 /data/data/[应用程序包名]/databases 的目录下。
【2】cd 命令:文件夹跳转命令。ls 命令:查看某个文件夹下面有哪些文件。
【3】使用 "sqlite3 [数据库名称] " 命令来对某数据库进行一系列的操作。
【4】在经过第【3】步骤后,可以使用 .tables 命令查看某数据库中包含哪些表。若要查询某表中包含的数据,在 sqlite> 命令后输入查询的sql语句即可查询,但要注意的是要以分号[;]来结束该语句的输入。
【5】若在命令行中输入 adb shell 后,提示:adb不是内部或外部命令,也不是可运行的程序,或批处理文件,遇到这种情况是由于环境变量没有设置好的问题导致的。解决方法:在安装的Android sdk 包目录下的找到adb工具所在目录,一般是在...\android-sdk-windows\tools目录或者在...\android-sdk-windows\platform-tools目录下。把该目录添加到path环境变量中就OK了。
ps:命令行查看android sqlite数据库
命令行查看sqlite数据库:
启动模拟器
命令行cd 到android-sdk-windows\platform-tools目录
adb shell //进入模拟器
cd /data/data/yourpackagename/ //进入到软件安装目录
cd databases //进入到数据库目录
ls //查看现有的数据库,如果创建过应该有个XXXX.db
sqlite3 XXXX.db //用sqlite3工具打开数据库
//下面是sqlite3命令
sqlite> .tables //查看数据库里面的表 本例应该能看到表YYYY
sqlite> .schema YYYY //查看表结构
sqlite> select * from YYYY; //查询表
关于如何在Android中使用SQLite实现最佳性能?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于android – 如何在SQLite中使用FTS3、Android 个人理财工具二:使用SQLite实现启动时初始化数据、Android 用SQLite实现事务的方法、Android中使用SQLite3 命令行查看内嵌数据库的方法的相关知识,请在本站寻找。
本文标签: