Android 数据库连接和游标哦天哪

2024-04-26

我读过很多关于如何在使用 android 时创建和使用数据库连接的博客和教程。尽管我有很多工作示例,但不同的实现会导致不同的问题。

例如,我使用数据源类,Datasource和一个数据库辅助类,DBManagement.

数据源

public class DataSource {
    // Database fields
    private SQLiteDatabase database;
    private DBManagement dbHelper;

    public SMSDataSource(Context context) {
        dbHelper = new DBManagement(context);
    }

    public void open() throws SQLException {
        if(database == null){
             database = dbHelper.getWritableDatabase();
        }
    }

public Cursor exampleCursor(long constraint){
    Cursor cur = database.query(DBManagement.TABLE_NAME,
            new String[] {DBManagement.Column}, "constraint="+constraint, null, null, null, null);
    return cur;
}
    //.. other methods down here which do rawQuery, QueryBuilder, etc.. 

数据库管理

public class DBManagement extends SQLiteOpenHelper{

    // .. table definitions and columns etc ..//

    public DBManagement(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);      
    }

在活动中的 onCreate 方法中,我将调用datasource.open()并且 SQL 连接已打开。之后我会做:

DataSource datasource = new DataSource();

Cursor cursor = datasource.exampleCursor(1);
startManagingCursor(cursor);

如果我导航到新活动,则会收到以下错误:

 06-27 21:59:14.812: E/Database(13396): close() was never explicitly called on database '/data/data/com.example.package/databases/db.db' 

如果我添加datasource.close();到 onCreate 结束时,任何简单的光标适配器都不起作用,或者如果在上下文菜单上执行操作,我会收到数据库未打开的错误。

处理上述问题的最佳方法是什么?

所以我做了以下操作,但仍然遇到数据库问题:

@Override
public void onBackPressed() {
    // do something on back.
    //Log.i(getClass().toString(), "onBackPressed");

    datasource.close();

    finish();
    return;
}

@Override
protected void onResume(){
    super.onResume();
    onCreate(null);
}


@Override
protected void onRestart(){
    datasource = new DataSource(this);
    datasource.open();

    filters = datasource.getFilterCursor();
    startManagingCursor(filters);

    super.onRestart();
}

@Override
protected void onPause(){
    //Log.i(getClass().toString(), "onPause");
    ((CursorAdapter) adapter).getCursor().close();
    datasource.close();
    super.onPause();
}   
@Override
protected void onStop(){
    //Log.i(getClass().toString(), "onStop");
    datasource.close();
    super.onStop();
}

My 数据源.java类有以下内容:

public Datasource(Context context){
     dbHelper = new DBManagement(context);
}

public void open() throws SQLException {
    if( database == null ){
           database = dbHelper.getWritableDatabase();
    }
}

public void close(){
    if(dbHelper != null){
         dbHelper.close();
    }
}

这其实很简单:

  • 明确关闭您的所有cursors完成后(使用finally), etc.
  • 不要使用startManagingCursor()
  • 使您的数据库包装器/帮助器/管理器/任何类成为单例
  • 不要明确调用close() on the 数据库助手。当你的进程死掉时我会自动关闭。

另外:频繁的打开和关闭绝对是一个坏主意,因为它会带来相当多的开销。

使用装载机也是一种选择。您绝对不需要使用内容提供程序来使用加载程序,但它并不像想象的那么简单。使用内容提供程序涉及 IPC,如果您不打算将数据导出到其他应用程序,那么这通常是多余的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 数据库连接和游标哦天哪 的相关文章

随机推荐

  • 如何在 std::shared_ptr 之间设置/获取 unsigned char *?

    我想设置unsigned char 数据到std shared ptr
  • 如何在 C# 中从 USB 令牌读取证书

    我有一个 USB 令牌 其中包含一个加密证书 该证书具有公钥和私钥 现在我想用 C 创建一个应用程序 通过它我可以找到可访问的证书信息 当我插入 USB 令牌时 它会被检测到 但计算机部分上没有显示任何驱动器 就像闪存驱动器一样 如何从 U
  • Tensorflow 何时更新权重和偏差?

    张量流什么时候更新for循环中的权重和偏差 下面是tf的github上的代码 mnist softmax py https github com tensorflow tensorflow blob master tensorflow ex
  • 如何通过 Azure Active Directory 对多租户 ASP.NET 应用程序进行身份验证?

    我一直在我的数据中心使用 Azure Active Directory 试用许可证进行一些测试 我们公司拥有自己的托管服务和物理硬件 目前我们希望保持这种状态 尽管我们将来可能会研究将其全部转移到云服务 目前 我们正在尝试为使用 Azure
  • 在 Android 中“注入所有内容”是一种不好的做法吗?

    在研究依赖注入时 我发现了一些建议的方法注入一切 http frogermcs github io inject everything viewholder and dagger 2 example 和其他人说没有必要这样做 https s
  • .clone() 和 .html() 有什么区别?

    Jquery 的 clone 和 html 函数有什么区别 Jquery 文档指出 clone 方法对匹配的集合执行深度复制 元素 这意味着它复制匹配的元素以及所有 它们的后代元素和文本节点 在 HTML 文档中 html 可用于获取任意内
  • self.__class__ 的快捷方式

    有时我发现自己正在接触班级成员 在一个项目中 我什至在类定义中包含了类定义 在这种情况下我经常发现mysql输入self class
  • 具有稀疏矩阵的 numpy 元素外积

    我想在 python 中对三个 或四个 大型二维数组进行逐元素外积 值是 float32 四舍五入到小数点后两位 它们都具有相同的行数 n 但具有不同的列数 i j k 所得数组的形状应为 n i j k 然后 我想对结果的每一列求和 最终
  • 阻止请求 URL selenium Firefox Python

    我试图在访问网站时阻止某些 URL 这意味着我只提出继续所需的请求 有一个 url 自动加载 5 MB 代码我无法阻止通过 Firefox 配置文件禁用 css 我读到硒不允许那么多的控制 但我不确定是否有某种方法可以使用插件来设置它 但是
  • 有没有办法像 Visual Studio 一样让 Xcode 5 自动完成?

    Xcode 5 现在取代了 Xcode 4 我对这两种 IDE 的一个常见抱怨是它们不能非常积极地自动完成 在 Visual Studio 中 只要您按下非标识符键 如括号 逗号 点 空格等 就会提交自动补全 在 Xcode 5 上 您必须
  • 我应该如何使用 Mojo::UserAgent 处理 HTML META 标记?

    我必须处理一些配置错误的 Web 服务器 因此我开始处理 HTML 元标记以将信息反馈到 Web 用户代理对象中 我尝试了多种方法来做到这一点莫乔利西斯 http mojolicio us并决定在响应中寻找 完成 事件 我的目标是让其余代码
  • 我如何从另一个功能模块访问活动

    我正在创建一个即时应用程序 其中包括应用程序模块 基本功能模块 即时应用程序模块和另一个功能模块 问题是我无法从基本功能和功能模块访问应用程序模块的活动 并且基本功能模块和功能模块之间也是如此 但我能够从应用程序模块访问基本功能模块的活动
  • 如何使用其他语言的语音识别 android

    我有一个曾经有效的代码 但由于某种原因它突然停止工作 我正在尝试使用希伯来语语音识别 但似乎从几天前开始它才开始英语语音识别 这是我的代码 sr SpeechRecognizer createSpeechRecognizer getAppl
  • iOS:在 UI(Sub)Views 中处理 UIGestureRecognisers

    我想知道如何最好地解决以下问题 我有一个 ViewController 它的视图包含大量复杂的子视图 UIView的子类 由于复杂性 其中一些 UIView 初始化自己的 UIGestureRecognisers 并实现相应的目标操作 因为
  • flake8 仅对代码块禁用 linter

    我在 python 中有一个文件 如下所示 def test constructor for legacy json Test if constructor works for a legacy JSON in an old databas
  • 将多头 pandas 数据帧输出到 Excel 时摆脱索引

    我有一个 pandas 数据框 如下所示 header np array location location location location2 location2 location2 np array S1 S2 S3 S4 S5 S6
  • 如何将 PowerPoint(.ppt、.pptx)转换为每张幻灯片的多个图像?

    你们有一些能够将 PowerPoint 演示文稿文件转换为图像的 Net 库吗 使用添加引用Microsoft Office Interop PowerPoint dll 要将 PowerPoint 幻灯片转换为 PNG 图像 PowerP
  • 如何向 UiBinder 中的 Google Web Toolkit 弹性表添加行?

    我在哪里可以找到UiBinder http code google com p google web toolkit wiki UiBinderFlexTable 的模板 我在用谷歌网络工具包 http en wikipedia org w
  • 如何获取Windows 7中的“临时文件夹”?

    在 Windows 7 中 如何以编程方式获取系统临时文件夹 The 获取临时路径 http msdn microsoft com en us library windows desktop aa364992 28v vs 85 29 as
  • Android 数据库连接和游标哦天哪

    我读过很多关于如何在使用 android 时创建和使用数据库连接的博客和教程 尽管我有很多工作示例 但不同的实现会导致不同的问题 例如 我使用数据源类 Datasource和一个数据库辅助类 DBManagement 数据源 public