Android 认为我没有关闭数据库!为什么?

2024-05-14

我有一个 SQLiteDatabase 数据成员,我在 onCreate 中初始化它,并在 onPause()、onStop() 和 onDestroy() 中调用 .close()。它在 onResume() 中重新初始化。它似乎运行得很好,但当我查看调试器时,它看到了这一点:

08-24 20:23:50.014: ERROR/Database(6767): Leak found
08-24 20:23:50.014: ERROR/Database(6767): java.lang.IllegalStateException: /data/data/com.hh.Timepunch/databases/times_database.db SQLiteDatabase created and never closed
08-24 20:23:50.014: ERROR/Database(6767):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1695)
08-24 20:23:50.014: ERROR/Database(6767):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:739)
08-24 20:23:50.014: ERROR/Database(6767):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:761)
08-24 20:23:50.014: ERROR/Database(6767):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:754)
08-24 20:23:50.014: ERROR/Database(6767):     at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:476)
08-24 20:23:50.014: ERROR/Database(6767):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
08-24 20:23:50.014: ERROR/Database(6767):     at com.hh.Timepunch.TimeSheetActivity.onCreate(TimeSheetActivity.java:72)
08-24 20:23:50.014: ERROR/Database(6767):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-24 20:23:50.014: ERROR/Database(6767):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
08-24 20:23:50.014: ERROR/Database(6767):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
08-24 20:23:50.014: ERROR/Database(6767):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
08-24 20:23:50.014: ERROR/Database(6767):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
08-24 20:23:50.014: ERROR/Database(6767):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-24 20:23:50.014: ERROR/Database(6767):     at android.os.Looper.loop(Looper.java:123)
08-24 20:23:50.014: ERROR/Database(6767):     at android.app.ActivityThread.main(ActivityThread.java:4363)
08-24 20:23:50.014: ERROR/Database(6767):     at java.lang.reflect.Method.invokeNative(Native Method)
08-24 20:23:50.014: ERROR/Database(6767):     at java.lang.reflect.Method.invoke(Method.java:521)
08-24 20:23:50.014: ERROR/Database(6767):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
08-24 20:23:50.014: ERROR/Database(6767):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-24 20:23:50.014: ERROR/Database(6767):     at dalvik.system.NativeStart.main(Native Method)
08-24 20:23:50.054: ERROR/Database(6767): Leak found
08-24 20:23:50.054: ERROR/Database(6767): java.lang.IllegalStateException: /data/data/com.hh.Timepunch/databases/times_database.db SQLiteDatabase created and never closed
08-24 20:23:50.054: ERROR/Database(6767):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1695)
08-24 20:23:50.054: ERROR/Database(6767):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:739)
08-24 20:23:50.054: ERROR/Database(6767):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:761)
08-24 20:23:50.054: ERROR/Database(6767):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:754)
08-24 20:23:50.054: ERROR/Database(6767):     at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:476)
08-24 20:23:50.054: ERROR/Database(6767):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
08-24 20:23:50.054: ERROR/Database(6767):     at com.hh.Timepunch.TimepunchActivity.onCreate(TimepunchActivity.java:60)
08-24 20:23:50.054: ERROR/Database(6767):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-24 20:23:50.054: ERROR/Database(6767):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
08-24 20:23:50.054: ERROR/Database(6767):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
08-24 20:23:50.054: ERROR/Database(6767):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
08-24 20:23:50.054: ERROR/Database(6767):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
08-24 20:23:50.054: ERROR/Database(6767):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-24 20:23:50.054: ERROR/Database(6767):     at android.os.Looper.loop(Looper.java:123)
08-24 20:23:50.054: ERROR/Database(6767):     at android.app.ActivityThread.main(ActivityThread.java:4363)
08-24 20:23:50.054: ERROR/Database(6767):     at java.lang.reflect.Method.invokeNative(Native Method)
08-24 20:23:50.054: ERROR/Database(6767):     at java.lang.reflect.Method.invoke(Method.java:521)
08-24 20:23:50.054: ERROR/Database(6767):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
08-24 20:23:50.054: ERROR/Database(6767):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-24 20:23:50.054: ERROR/Database(6767):     at dalvik.system.NativeStart.main(Native Method)
08-24 20:23:50.199: ERROR/libs3c2drender(1912): int S3c2DRender::DoG2D(unsigned int, s3c_img*, s3c_rect*, unsigned int, s3c_img*, s3c_rect*, int, int)::S3C_G2D_ROTATOR_18176 fail

我收到此错误的地方之一是离开此活动时:

public class TimepunchActivity extends Activity {

        Calendar timeNow = Calendar.getInstance();
        SQLiteDatabase timesDatabase;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.timepunch);

            //Create/open and configure database (if necessary)
            timesDatabase = openOrCreateDatabase(
                    "times_database.db",
                    SQLiteDatabase.CREATE_IF_NECESSARY,
                    null);
            timesDatabase.setLocale(Locale.getDefault());
            timesDatabase.setLockingEnabled(false);
            timesDatabase.setVersion(3);

            //lenient is set to true so incrementing minute 59 auto increments hour, etc
            timeNow.setLenient(true);

            //Create table (if necessary)
            final String dbCommand = "CREATE TABLE IF NOT EXISTS Timepunches (punch INTEGER PRIMARY KEY);";
            timesDatabase.execSQL(dbCommand);

            updateLastInPunch();

            Button punchButton = (Button)findViewById(R.id.punch_button);
            punchButton.setHapticFeedbackEnabled(true);
            punchButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    //Insert data
                    ContentValues punchValue = new ContentValues();
                    punchValue.put("punch", timeNow.getTimeInMillis());
                    long newPunchID = timesDatabase.insert("Timepunches", null, punchValue);
                    punchValue.clear();

                    //if punch already exists
                    if (newPunchID < 0) {
                        AlertDialog.Builder builder = new AlertDialog.Builder(TimepunchActivity.this);
                        builder.setTitle("Whoops")
                            .setMessage("I've already recorded a punch for this time and day.")
                            .setCancelable(true)
                            .setNeutralButton("Oh", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    dialog.cancel();
                                }
                            })
                            .show();
                    }
                    else {
                    }
                } //end setOnClick()
            }); //end click listener for punchButton
        } //end onCreate()



        @Override
        public void onResume() {
            super.onResume();
            checkFirstTimer();

            //Open and configure database
            timesDatabase = openOrCreateDatabase(
                    "times_database.db",
                    SQLiteDatabase.CREATE_IF_NECESSARY,
                    null);
            timesDatabase.setLocale(Locale.getDefault());
            timesDatabase.setLockingEnabled(false);
            timesDatabase.setVersion(3);


            //Update date object for current time
            timeNow.setTimeInMillis(System.currentTimeMillis());
            timeNow.set(Calendar.SECOND, 0);
            timeNow.set(Calendar.MILLISECOND, 0);
            updateClock((TextView)findViewById(R.id.current_time_textbox), timeNow);

            updateLastInPunch();
        } //end onResume()


        @Override
        public void onPause() {
            super.onPause();
            timesDatabase.close();
        } //end onResume()

        @Override
        public void onStop() {
            super.onStop();
            timesDatabase.close();
        } //end onResume()

        @Override
        public void onDestroy() {
            super.onDestroy();
            timesDatabase.close();
        } //end onResume()



        //Shows last in-punch that has no out-punch
        // if there is none it hides the section
        public void updateLastInPunch() {
            Cursor punchCursor = timesDatabase.query("Timepunches", null, null, null, null, null, "punch ASC;");

            TextView inPunchLabel = (TextView)findViewById(R.id.in_punch_label_textview);
            TextView inPunchTV = (TextView)findViewById(R.id.in_punch_time_textview);

            //odd count means there is a missing punch (assumed to be latest in punch)
            // therefore show last in punch
            if ((punchCursor.getCount()%2) != 0) {
                punchCursor.moveToLast();
                Calendar lastIn = Calendar.getInstance();
                lastIn.setTimeInMillis(punchCursor.getLong(0));

                updateClock((TextView)findViewById(R.id.in_punch_time_textview), lastIn);

                inPunchLabel.setVisibility(View.VISIBLE);
                inPunchLabel.setAnimation(fadeInAnimation);
                inPunchLabel.startAnimation(fadeInAnimation);

                inPunchTV.setVisibility(View.VISIBLE);
                inPunchTV.setAnimation(fadeInAnimation);
                inPunchTV.startAnimation(fadeInAnimation);
            }
            else {
                //only fade when "turning off" last punch display
                // (don't fade away when returning to screen)
                if (inPunchLabel.getVisibility() == View.VISIBLE) {
                    inPunchLabel.setAnimation(fadeOutAnimation);
                    inPunchLabel.startAnimation(fadeOutAnimation);
                    inPunchLabel.setVisibility(View.INVISIBLE);

                    inPunchTV.setAnimation(fadeOutAnimation);
                    inPunchTV.startAnimation(fadeOutAnimation);
                    inPunchTV.setVisibility(View.INVISIBLE);
                }
            }
            punchCursor.close();
        } //end getLastInPunch()
    } //end TimepunchActivity

但奇怪的是,这个错误并不是持续存在的。

除了调用 .close() 之外,我还需要做更多的事情吗?


问题是您在 onCreate 和 onResume 中创建/打开它,因此您需要执行两次。同样,您将其关闭两次,因此它可能会崩溃。

一般来说 - 你为什么不使用SQLiteOpenHelper?这将使您的数据库管理变得更加容易。

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

Android 认为我没有关闭数据库!为什么? 的相关文章

  • 将 EditText 聚焦在设备上运行的 PopupWindow 中时出现异常

    我正在为 Android 开发一个弹出窗口 它正在工作 我在上面添加了一个 EditText 和一个按钮 当在 ADV 上运行时 它可以正常工作 而在设备上运行时 当我专注于 EditText 时 这会抛出一个奇怪的异常 android v
  • 已使用不兼容的格式定义属性(此处定义的原始属性)

    添加后无法构建项目 compile com android support design 24 2 0 一直报如下错误 看起来 问题在于支持矢量绘图 某处某些属性被添加两次 例如 构建的values xml文件包含
  • 如何使用 aerospike 加载器在 aerospike 中加载嵌套的 csv 文件?

    我已将 JSON 文件转换为 CSV 格式 现在使用 aerospike 加载器将 CSV 加载到 Aerospike 中 我可以为简单的结构执行此操作 但如何修改 allDatatype json 的内容以在 Aerospike 中加载嵌
  • Firebird 和 Android JDBC 驱动程序

    火鸟有问题 我从未与 DB 合作过 服务器 firebird 1 5 上的数据库 添加库 firebird full 2 2 4到 libs 文件夹 将其添加到 Gradle implementation fileTree libs 将其添
  • 没有 ContentProvider 的 SyncAdapter

    我想为我想要与服务器同步的内容实现 SyncAdapter 看来要做到这一点 您需要为 SyncAdapter XML 属性文件中指定的权限注册一个 ContentProvider 由于我不希望手机的其余部分可以访问此内容 因此我没有实现自
  • 使用远程数据编写 Android、iPad、iPhone 客户端的技术

    我需要探索世界 你写了一个杀手级应用程序 但你有 Android iPhone iPad 客户端吗 我的问题是 1 向这些设备发送数据的最佳方式是什么 按照建议进行肥皂和休息here https stackoverflow com ques
  • activemq 的优先级

    我们目前正在使用 JMS 和 activemq 5 5 1 开发一个应用程序 我们想为某些消息定义更高的优先级 这将使它们首先被消耗 设置生产者和消费者后 通过spring 3 1 JMSTemplate 优先级并不能完全发挥作用 事实上
  • Java中无参数的for循环

    我在看别人的代码 发现了这段代码 for 我不是 Java 专家 这行代码在做什么 起初 我认为这会创建一个无限循环 但在该程序员使用的同一个类中 while true 其中 如果我错了 请纠正我 是一个无限循环 这两个相同吗 为什么有人会
  • 使用 Java 通过 HTTP 下载未知长度的文件

    我想用java下载一个HTTP查询 但是我下载的文件在下载时有一个未确定的长度 我认为这将是相当标准的 所以我搜索并找到了它的代码片段 http snipplr com view 33805 http snipplr com view 33
  • 在 Android 中使用 Fragment 时处理后按

    我在应用程序中使用 Android 滑动菜单和导航抽屉 并且在应用程序中使用片段而不是活动 当我打开抽屉时 单击一个项目会出现一个片段 我使用以下代码从一个片段移动到另一个片段 Fragment fragment null fragment
  • 使用 Nexus 10 在 Android 4.3 上滚动时性能不佳

    我的应用程序有一个带有一些滚动的列表视图 在我测试过的所有手机 Nexus One Nexus 4 和 Galaxy S3 4 上都表现得非常好 以 60fps 滚动 但 Nexus 10 上的表现很糟糕 大概在 15fps 左右 我已经将
  • 如果没有按钮,Espresso 不会记录任何意图

    我正在尝试编写一个测试来验证使用浓缩咖啡启动的意图 问题是有意的 不记录任何意图 我有这个测试 Test public void shoulddosomething startActivity intended hasComponent h
  • Android 中的垂直(旋转)标签

    我需要两种在 Android 中显示垂直标签的方法 水平标签逆时针旋转 90 度 字母在侧面 带有字母的水平标签 如商店招牌 我是否需要为这两种情况 一种情况 开发自定义小部件 我可以使 TextView 以这种方式呈现吗 如果我需要完全自
  • Python 可以替代 Java 小程序吗?

    除了制作用于物理模拟 如抛射运动 重力等 的教育性 Java 小程序之外 还有其他选择吗 如果你想让它在浏览器中运行 你可以使用PyJamas http pyjs org 这是一个 Python 到 Javascript 的编译器和工具集
  • Drools:为什么是无状态会话?

    Drools 使用会话来存储运行时数据 为此 有两种会话 无状态和有状态 与无状态会话相比 有状态会话允许迭代调用 并且似乎比无状态会话具有所有优势 那么为什么会有无状态会话呢 他们服务的目的是什么 与有状态会话相比 它们的优势是什么 谢谢
  • spring data jpa 过滤 @OneToMany 中的子项

    我有一个员工测试实体是父实体并且FunGroup信息子实体 这两个实体都是通过employeeId映射 我需要一种方法来过滤掉与搜索条件匹配的子实体 以便结果仅包含父实体和子实体 满足要求 员工测试类 Entity name Employe
  • 使用 unnest() 返回行?

    我尝试在完成后返回一组行UPDATE 像这样的东西 UPDATE Notis new noti SET notis noti record type FROM SELECT FROM Notis WHERE user id 2 FOR UP
  • Android 2.2 中不带预览的相机捕获

    我需要捕获图像而不显示预览 我想在后台作为服务来完成它 可以这样做吗 是有可能实现的 您应该定义一个处理 Camera 对象的类 例如调用 Camera open 等 不要为相机对象提供以下行以禁用预览 mCamera setPreview
  • 如何隐藏或删除 Android HoneyComb 中的状态栏?

    如何隐藏或删除 Android HoneyComb 中的状态栏 每次运行应用程序时 我都会发现某些内容必须被状态栏覆盖 我尝试改变AndroidManifest xml 但没有任何改变 你不知道 它被认为是永久的屏幕装饰 就像电容式主页 菜
  • 在 Android Studio 中打开上次关闭的选项卡

    我是 Android Studio 的新手 想知道是否有任何快捷方式 选项可以重新打开上次关闭的选项卡 没有分配快捷方式 但您可以轻松分配新的快捷方式 Go to IDE settings Keymap Main menu Window E

随机推荐