如何使用SQLite,Android上SQLite的最佳实践

 我来答
huanglenzhi
2015-05-16 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517196
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
  前些时候看到兴趣小组里有人问“Android上SQLite的最佳实践”是什么,好奇地搜了一下,确实没有一个好一点的指导文档,平时的使用也只是简单的拷贝code,并没有深入的研究过。以下是我看到的Kevin关于其使用的心得,原文的大体的意思是:

  Android例子涵盖了一些Sqlite的基本用法,但它们并没有深入地给出合理的使用方法,更重要的是,不合理的使用方法。大多数例子和文档只是涉及最基本的数据库查询,或者教你如何创建一个ContentProvider。从来不提及的地方像:

  · 什么地方创建和保存SQLiteOpenHelper实例?

  · 可以有多少个实例?

  · 多线程同时访问数据库有没有什么要担心的?

  基本的内容是,你可以任意次数地连接Sqlite数据库,而且Android系统也支持你这样做。Sqlite拥有文件级别的锁,用来同步访问和防止错误。如果你只知道这些,那么,将会给你带来很大的痛苦。开源的一个好处是,你可以深入代码一探究竟。从代码和一些测试中,我了解到以下事实:

  · Sqlite拥有文件级别的锁。许多线程可以同时读,但只有一个可以写。锁阻止多个同时写入。

  · Android在SQLiteDatabase中实现了一些java锁来确保动作是同步进行。

  · 如果你用多个线程疯狂地访问数据库,你的数据库不会(或不应该)崩溃。

  没提到的是,如果你通过多个不同的真实连接同时写数据库,其中的某个会失败,它不会等到前一个完成后继续写入。简单地,不会写入你的改变,更糟糕的是,你也得不到一个异常,只是在LogCat中输出一些message,仅此而已。

  SQLiteOpenHelper类做了一些有趣的事。尽管它有方法可以获得一个只读的连接和可读写的连接,但实质上它们是同一个连接。假设没有文件写错误的话,只读的连接实质上就是一个可读写的连接。有趣吧。因此,如果你的app中使用一个helper的话,即便从多线程中使用,你也从未使用多个连接。

  同样,一个helper中只有一个SQLiteDatabase的实例,这个实例中实现了一些java锁。因此,当你正在执行数据库的操作时,其它db的操作都将锁定。即便是你使用多个线程来做这些事以便优化数据库的性能,坏消息,没有什么用。

  按照我的认识,SQLite工作的方式,基本上不可能会破坏你的数据库,除非代码里有bug或者有硬件问题。

  因此,我推荐这样使用:创建一个SQLiteOpenHelper静态对象。什么时候去close它呢?不需要。当app关闭,它会自动释放文件引用。

  但是,会不会有“close() was never explicitly called on database”异常呢?

  如果你注意的话,当连接挂在那里的时候,你没有得到那个异常。你只是在连接已经建立,而你又尝试打开另一个时才会有异常。因此,你只需要打开一次连接。

  像这样来使用:

  public class DatabaseHelper extends OrmLiteSqliteOpenHelper
  
  {
  
  private static DatabaseHelper instance;
  
  
  
  public static synchronized DatabaseHelper getHelper(Context context)
  
  {
  
  if (instance == null)
  
  instance = new DatabaseHelper(context);
  
  
  
  return instance;
  
  }
  
  //Other stuff...
  
  }
Storm代理
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企... 点击进入详情页
本回答由Storm代理提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式