`
jiguansheng
  • 浏览: 128448 次
  • 性别: Icon_minigender_1
  • 来自: 九江
社区版块
存档分类
最新评论

如何使用SQLite

 
阅读更多

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

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

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

        ·         可以有多少个实例?

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

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

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

        ·         AndroidSQLiteDatabase中实现了一些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... 

}

分享到:
评论

相关推荐

    uniAPP使用sqlite数据库demo

    这个“uniAPP使用sqlite数据库demo”是一个示例项目,旨在展示如何在uniAPP中集成并操作SQLite数据库。下面我们将详细探讨相关知识点。 1. **uniAPP介绍**: - uniAPP是由HBuilderX开发的一款基于Vue.js的开源框架...

    VS2010使用SQLite数据库的Demo

    在本文中,我们将深入探讨如何在Visual Studio 2010 (VS2010) 中使用SQLite数据库进行基本操作,包括数据库的创建、建表、插入数据以及查询数据。SQLite是一个轻量级的、开源的嵌入式SQL数据库引擎,它无需单独的...

    VB6 下使用SQLite 的完整例子,最全面

    3. 打开数据库:使用`sqlite3_open`函数指定数据库文件路径,创建或打开一个SQLite数据库连接。 4. 执行SQL语句:通过`sqlite3_exec`函数执行INSERT、SELECT、UPDATE、DELETE等SQL命令。 例如,创建一个新表的代码...

    LabVIEW使用SQLite数据库范例(需要自行下载SQLite的工具包)

    此外,LabVIEW范例可能还涵盖了查询数据的示例,这通常涉及使用`sqlite3_prepare_v2`创建一个`SELECT`语句,然后通过`sqlite3_step`获取结果集,并用`sqlite3_column_`系列函数获取每行数据的各个列值。 在实际应用...

    Delphi使用SQLite3内存数据库

    在本文中,我们将深入探讨如何在Delphi编程环境中利用SQLite3数据库系统,特别是关于本地数据库与内存数据库的使用。SQLite3是一种轻量级、自包含的数据库引擎,它不需要独立的服务器进程,使得在Delphi应用程序中...

    VB6 下使用SQLite 的完整例子,最全面,最好用。

    **VB6 使用SQLite的完整教程** 本教程提供了一个详尽的VB6(Visual Basic 6)环境下使用SQLite数据库的实例,旨在帮助开发者更好地理解和运用SQLite。SQLite是一个轻量级、自包含的数据库引擎,适用于各种应用程序...

    nwjs(v0.14.7)中使用sqlite3所需的编译文件和使用教程

    9. **使用教程**:一旦编译完成并成功导入,你就可以开始使用SQLite3 API进行数据操作,如创建数据库、表,执行SQL查询,事务处理等。务必遵循SQLite3的官方文档和Node.js的异步编程模型。 这个压缩包提供的文件...

    Unity3d使用sqlite例子

    标题"Unity3d使用sqlite例子"表明我们将探讨如何在Unity3D项目中使用SQLite数据库进行数据管理。这个例子可能是通过一个具体的项目或脚本来展示如何与SQLite交互,包括创建数据库、表,以及插入、查询和更新数据等...

    在VS2008桌面使用SQLite

    在Visual Studio 2008(VS2008)中使用SQLite是一个高效且轻量级的方法,尤其适合开发桌面应用程序。SQLite是一个开源的关系型数据库管理系统,它不需要单独的服务器进程,可以直接嵌入到应用程序中,这使得它成为...

    Android中使用SQLite示例

    以下是对Android中使用SQLite进行详细讲解: 1. **SQLite简介** SQLite是一个开源、嵌入式的关系型数据库,支持SQL标准。在Android中,每个应用程序都可以拥有自己的SQLite数据库,并且无需额外的服务器进程。它的...

    vs2010中mfc使用sqlite3

    VS2010中MFC使用SQLite3 本文主要讲述如何在VS2010中使用MFC框架结合SQLite3数据库进行开发。SQLite3是一个轻量级的关系型数据库管理系统,它小巧、快速、可靠、跨平台,非常适合在移动设备、嵌入式系统和桌面应用...

    WinCE下使用sqlite数据库

    WinCE 下使用 SQLite 数据库 WinCE 作为一种嵌入式操作系统,广泛应用于 Various 嵌入式设备中,而 SQLite 则是一种轻量级、跨平台的关系型数据库管理系统。因此,在 WinCE 平台下使用 SQLite 数据库是非常常见的...

    MFC 使用sqlite3 例子

    在本文中,我们将深入探讨如何在Microsoft Foundation Class (MFC) 应用程序中使用SQLite3数据库引擎。这个示例项目是使用Visual Studio 2010开发的,它演示了MFC对话框中对SQLite数据库的基本操作,包括添加、删除...

    VB.NET 中使用 SQLite3 的演示代码

    首先,为了使用SQLite3,你需要在项目中引入System.Data.SQLite NuGet包。这个包包含了.NET Framework与SQLite3交互所需的所有组件。在Visual Studio中,可以通过右键点击解决方案资源管理器中的项目,选择“管理...

    使用sqlite3的类库和.h文件

    SQLite3是一种轻量级、开源的数据库管理系统,广泛应用于嵌入式系统和移动应用中,因为它无需服务器进程,可以直接在应用程序中使用。本教程将详细讲解如何在C++项目中利用sqlite3的类库和头文件进行数据库操作。 ...

    VC使用SQLITE数据库

    本教程将详细介绍如何在VC中使用SQLite数据库,实现客户端功能,无需安装OFFICE或大型数据库系统。 首先,你需要获取SQLite的动态链接库(DLL)或静态库文件,并将其包含到你的VC项目中。这通常可以从SQLite的官方...

    java创建使用SQLite数据库以及SQLiteDeveloper工具.rar

    在Java编程环境中,SQLite是一个轻量级的、开源的关系型数据库管理系统,它不需要单独的服务器进程,可以直接在应用程序中使用。SQLite数据库非常适合于移动设备、嵌入式系统或作为小型项目的数据存储解决方案。本...

    VC++6.0使用sqlite3链接的总结

    自己个人的一些有关于在VC++6.0的情况下使用sqlite的一些基本操作的总结

    图书:使用SQLite

    《使用SQLite》是一本专注于SQLite数据库管理系统的图书,旨在帮助读者深入理解和熟练运用这一轻量级、开源且无服务器的数据库引擎。SQLite是一款广泛应用于移动设备、嵌入式系统以及桌面应用中的数据库解决方案,因...

    Linux下使用sqlite3数据库详解

    ### Linux下使用sqlite3数据库详解 #### 一、引言 SQLite是一款轻量级的数据库管理系统,被广泛应用于各种场景,特别是在嵌入式系统及移动设备中。它以源码形式发布,支持跨平台特性,并且可以作为一个独立的库...

Global site tag (gtag.js) - Google Analytics