【问题标题】:Android Studio - unable to retreive data from preinstalled sqlite databaseAndroid Studio - 无法从预装的 sqlite 数据库中检索数据
【发布时间】:2019-07-12 09:10:04
【问题描述】:

编辑:我仍然找不到解决此问题的方法。出于某种原因,查询的数据库是空的,尽管它已满且位于正确的位置。如果您发现我的数据库助手有任何问题或我可以尝试的任何其他问题,我将不胜感激。

我正在开发一个应用程序,它从 SQLite 数据库中返回与鸟类相关的信息。当我查询此数据库时,我收到错误消息:'SQLiteLog: (1) no such column: 'size'' 等。

我已经验证了我的 rawQuery() 查询格式正确,并且应该通过在 SQLite 浏览器中运行查询以及咨询 Stackoverflow 上的建议来返回我期望的信息。我曾尝试使用替代数据库资产类 SQLiteAssetHelper,但遇到了与使用 SQLiteOpenHelper 相同的问题。

我认为这可能与: 测试手机 - Moto g6 play - 此手机未植根。这可能是在测试期间将数据库迁移到手机以供应用程序使用的问题吗? 数据库的形成 - 这是由我编写的 python 脚本填充的。某些元数据等是否格式不正确或不兼容?

package com.example.newbuild;

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


public class DatabaseHelper extends SQLiteOpenHelper {
    //db info
    private static final String DATABASE_NAME = "birdsDB.db";
    //    FileInputStream fis = new FileInputStream(new File(DATABASE_NAME));

// Log info for debugging:
private static final String TAG = "DatabaseHelper";

// set variables to name database
private static final int DATABASE_VERSION = 3;

// name of table 1:
private static final String MAIN_TABLE = "main";

// name of bird image table:
private static final String PIC_TABLE = "picLinks";

// names of MAIN columns:
private static final String ID = "id";
private static final String COMMON = "common";
private static final String SCINAME = "sciname";
private static final String FAMILY = "family";
private static final String BIRDCATEG = "category";
private static final String SIZE = "size";
private static final String DESC = "description";
private static final String RANGEPIC = "rangepicid";
private static final String SIGHTED = "sighted";

// names of BIRD IMAGE columns
private static final String BIRD_IMAGE_NO = "picKey";
private static final String BIRD_ID = "birdId";
private static final String IMAGE_LINK = "link";

private Context mContext;
private SQLiteDatabase mDB;


public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    Log.i(TAG, "now calling database helper");

}

@Override
public void onCreate(SQLiteDatabase db) {
    Log.d(TAG, "attempting to create table from onCreate");
    String CREATE_MAIN_TABLE =
            "CREATE TABLE " +
                    MAIN_TABLE +
                    "(" +
                    ID + "INTEGER PRIMARY KEY," +
                    COMMON + " TEXT," +
                    SCINAME + " TEXT," +
                    FAMILY + "TEXT," +
                    BIRDCATEG + "TEXT," +
                    SIZE + "TEXT," +
                    DESC + "TEXT," +
                    RANGEPIC + "TEXT," +
                    SIGHTED + "TEXT" +
                    ")";
    db.execSQL(CREATE_MAIN_TABLE);
    Log.d("table", CREATE_MAIN_TABLE);
}


@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    Log.i(TAG, "now calling onUpgrade");
    db.execSQL("DROP TABLE IF EXISTS " + MAIN_TABLE);
    onCreate(db);

}

}

public ArrayList<String> getCategory(String[] name) {
        String TABLE_BIRDS = "main";
        ArrayList<String> categories = new ArrayList<>();

        if (name[0] != null) {
            Log.d(LOG_TAG, name[0]);
        } else {
            Log.d(LOG_TAG, "name[0] has not been passed");
        }
        Log.d(LOG_TAG, "SELECT DISTINCT " + name[0] + " FROM " + TABLE_BIRDS);

        Cursor x = db.rawQuery("SELECT DISTINCT " + name[0] + " FROM " + TABLE_BIRDS, null);
        if (x.getCount() == 0) {
            Log.i(LOG_TAG, "The cursor is not returning any data");
        }

        while (x.moveToNext()) {
            String category = x.getString(0);
            categories.add(category);
            Log.i("cursor loop", category);
        }
        return categories;
    }

当上面的代码传递字符串'category'时,我的数据库应该返回六个不同类别的鸟类字符串。相反,我发现错误消息包括“E/SQLiteLog: (1) no such column: category”。

【问题讨论】:

  • 您是否尝试卸载并重新安装该应用程序?
  • 注意:您必须卸载并重新安装应用程序才能获得任何更改
  • 您是否尝试了这两种解决方案并再次卸载并安装了该应用程序?
  • 被查询的数据库是空的,尽管已满且在正确的位置似乎没有满。为了完整,它必须已从您的应用程序的资产文件夹复制到设备中的正确文件夹。你有代码可以做到这一点吗?如果没有,那么您只需创建一个带有空表的数据库。

标签: java android sqlite android-studio


【解决方案1】:

我认为这可能与:测试手机 - Moto g6 play - 这个手机没有root。这可能是迁移的问题 数据库转移到手机上供应用在测试期间使用?

我不这么认为,因为您通常会在未找到列之前获得未找到表。

我建议暂时将查询更改为:-

Cursor x = db.rawQuery("SELECT * FROM " + TABLE_BIRDS + " LIMIT 10", null);

后跟:-

DatabaseUtils.dumpCursor(x);

第一个更改将从表的 10 行中提取所有列。 第二行会将光标中的数据输出到日志中,包括列名。

我怀疑列名不正确或缺失。这种情况下需要确保assets文件夹中的文件是正确的,当确保删除数据库(删除Apps数据或卸载App)后再重新运行App。

【讨论】:

  • 谢谢。我已经运行了您建议的查询。输出为:" I/System.out: >>>>> 转储光标 android.database.sqlite.SQLiteCursor@cb00f00 I/System.out:
  • 如何删除应用程序数据/卸载应用程序,然后重新运行应用程序?
  • @grainman 设置 - 应用程序 - 选择应用程序。桌子是空的。
  • 您的意思是Android Studio中的文件-设置-...吗?我在这里找不到任何“应用程序”标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2015-12-28
  • 2015-05-27
  • 1970-01-01
  • 2018-04-18
  • 2011-09-09
相关资源
最近更新 更多