当前位置: 首页 > 知识库问答 >
问题:

sdcard上数据库的游标未关闭或停用

广瑞
2023-03-14

在下面的代码中,连接到sdcard上的数据库,数据库打开,但在logcat中显示错误。

package com.avizhegroup.islamatlas.SQLiteMethods;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.avizhegroup.islamatlas.model.Point;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.util.Log;

public class DatabaseHandler extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "Data.db";

    private static final String TABLE_POINTDATA = "PointData";
    private static final String TABLE_POINTDATA_PRIMARYCATEGORYID = "PrimaryCategoryId";
    private static final String TABLE_POINTDATA_SECONDARYCATEGORYID = "SecondaryCategoryId";
    private static final String TABLE_POINTDATA_POINTID = "PointId";
    private static final String TABLE_POINTDATA_POINTNAME = "PointName";
    private static final String TABLE_POINTDATA_POINTSUMMARY = "PointSummary";
    private static final String TABLE_POINTDATA_POINTLAT = "PointLat";
    private static final String TABLE_POINTDATA_POINTLNG = "PointLng";
    private static final String TABLE_POINTDATA_POINTMARKERKIND = "PointMarkerKind";
    private static final String TABLE_POINTDATA_TAG = "POINT DATA TAG";

    private SQLiteDatabase db;

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

    // Getting All Points
    public List getAllPoints() {
        List pointsList = new ArrayList();

        String selectQuery = "SELECT * FROM " + TABLE_POINTDATA;
        File dbfile = new File(Environment.getExternalStorageDirectory()
                .getPath() + File.separator + "Data.db");
        db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);

        if (db.isOpen()) {
            Log.d("ISLAM ATLAS", "database is Open");
        }

        Cursor cursor = db.rawQuery(selectQuery, null);
        try {
            if (cursor.moveToFirst()) {
                do {
                    Point point = new Point();
                    point.setPrimaryCategoryId(Integer.parseInt(cursor
                            .getString(0)));
                    point.setSecondaryCategoryId(Integer.parseInt(cursor
                            .getString(1)));
                    point.setId(Integer.parseInt(cursor.getString(2)));
                    point.setName(cursor.getString(3));
                    point.setSummary(cursor.getString(4));
                    point.setLatitude(Double.parseDouble(cursor.getString(5)));
                    point.setLongtitude(Double.parseDouble(cursor.getString(6)));
                    point.setType(cursor.getString(7));

                    pointsList.add(point);

                } while (cursor.moveToFirst());
            }
        } finally {
            cursor.deactivate();
            cursor.close();
            db.close();
        }
        return pointsList;
    }
}

而logcat错误为:

10-20 10:31:33.069: E/Database(460): close() was never explicitly called on database '/mnt/sdcard/Data.db' 
10-20 10:31:33.069: E/Database(460): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
10-20 10:31:33.069: E/Database(460):    at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1810)
10-20 10:31:33.069: E/Database(460):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
10-20 10:31:33.069: E/Database(460):    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
10-20 10:31:33.069: E/Database(460):    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
10-20 10:31:33.069: E/Database(460):    at com.avizhegroup.islamatlas.SQLiteMethods.DatabaseHandler.getAllPoints(DatabaseHandler.java:51)
10-20 10:31:33.069: E/Database(460):    at com.avizhegroup.islamatlas.MainActivity.onCreate(MainActivity.java:40)
10-20 10:31:33.069: E/Database(460):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

谢谢你帮我。

共有1个答案

商同化
2023-03-14

我发现了窃听器。在while(Cursor.MoveToFirst())中;更改为while(Cursor.MoveToNext());谢谢

 类似资料:
  • 问题内容: 每当我们从数据库或类似来源获取一些用户输入的内容并进行一些编辑时,我们都可能会检索仅包含开始标记但没有结束标记的部分。 这可能会妨碍网站的当前布局。 有客户端或服务器端的方法可以解决此问题吗? 问题答案: 找到了一个很好的答案: 使用PHP 5并使用DOMDocument对象的loadHTML()方法。此自动解析格式错误的HTML,随后对saveXML()的调用将输出有效的HTML。D

  • 因此,当我在表单上输入信息后,它会用新表单刷新new.php页面,但不会提交任何信息。我没有错误,就像我在页面上点击刷新一样。我觉得我做的一切都是对的,但我似乎不明白为什么这不起作用。我刚刚从mysql过渡到mysqli,所以我有点像新手。它也没有回到home.php. new.php

  • 我想知道。 是否可以在外部存储卡中创建数据库? 更新:-

  • 本文向大家介绍mongodb数据库游标的使用浅析,包括了mongodb数据库游标的使用浅析的使用技巧和注意事项,需要的朋友参考一下 mongodb中的游标使用示例如下:   假设执行如下操作: 使用find()返回一个游标: 使用游标的forEach()循环遍历:

  • 问题内容: 我正在构建WSGI Web应用程序,并且有一个MySQL数据库。我正在使用MySQLdb,它提供了用于执行语句和获取结果的游标。 获取和关闭游标的标准做法是什么? 特别是,我的光标应持续多长时间?我应该为每个交易获取一个新的游标吗? 我相信您需要在提交连接之前关闭游标。查找不需要中间提交的事务集是否有任何显着的优势,这样您就不必为每个事务获取新的游标?获取新的游标是否有很多开销,还是不

  • 问题内容: 我有些困惑,我从阅读以下内容 你不需要关闭conn连接吗?如果conn.close()没有发生,那实际上是怎么回事? 我有一个正在维护的私有Web应用程序,该应用程序当前无法关闭任何一种形式,但是重要的应用程序真的是stmt,conn还是两者兼而有之? 该站点间歇性地关闭,但是服务器一直在说这是数据库连接问题,我怀疑它没有关闭,但是我不知道该关闭哪个。 问题答案: 使用完之后,你需要通