GVKun编程网logo

如何在Android中使用SQLite实现最佳性能?

10

在本文中,您将会了解到关于如何在Android中使用SQLite实现最佳性能?的新资讯,并给出一些关于android–如何在SQLite中使用FTS3、Android个人理财工具二:使用SQLite实

在本文中,您将会了解到关于如何在Android中使用SQLite实现最佳性能?的新资讯,并给出一些关于android – 如何在SQLite中使用FTS3、Android 个人理财工具二:使用SQLite实现启动时初始化数据、Android 用SQLite实现事务的方法、Android中使用SQLite3 命令行查看内嵌数据库的方法的实用技巧。

本文目录一览:

如何在Android中使用SQLite实现最佳性能?

如何在Android中使用SQLite实现最佳性能?

我注意到有多种方法可以执行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

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实现启动时初始化数据

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实现事务的方法

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 命令行查看内嵌数据库的方法

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 命令行查看内嵌数据库的方法的相关知识,请在本站寻找。

本文标签:

上一篇android – 如何在SQLite中将毫秒转换为日期(sql将毫秒值转换为日期)

下一篇android – 错误:软件包GooglePlayServicesClient不存在(googleplay安装显示应用未安装)