`
jiguansheng
  • 浏览: 127593 次
  • 性别: 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命令。 例如,创建一个新表的代码...

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

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

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

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

    Delphi使用SQLite3内存数据库

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

    Unity3d使用sqlite例子

    标题"Unity3d使用sqlite例子"表明我们将探讨如何在Unity3D项目中使用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数据库的基本操作,包括添加、删除...

    使用sqlite3的类库和.h文件

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

    VC使用SQLITE数据库

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

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

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

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

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

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

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

    图书:使用SQLite

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

    Linux下使用sqlite3数据库详解

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

    vc++ 使用sqlite3.0实例包

    VC++是Microsoft Visual Studio提供的一个C++集成开发环境,非常适合与SQLite结合使用。 首先,我们需要了解SQLite3的安装和配置。下载SQLite3的源代码或预编译库,并将其添加到VC++项目的依赖目录。预编译库通常...

Global site tag (gtag.js) - Google Analytics