java - 预填充的 SQLite 数据库无法在 Android Studio 中正确读取

标签 java android database sqlite search

我是 StackOverflow 的新手,所以我不确定它是如何工作的,但我真的需要一些关于我在 Android Studio 中构建的应用程序的帮助。我有一个预填充的 chemicals.sqlite 数据库,我试图在 Android Studio 中搜索它。基本上,我正在设计的应用程序将允许用户按名称搜索化合物,并将显示有关它的信息。出于某种原因,我的程序说它无法显示我试图在应用程序模拟器中搜索的任何值。它总是显示“找不到匹配项”。

这是我的 DatabaseHelper 类:

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DataBaseHelper extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "chemicals.sqlite";
private static final String TABLE_OSHA = "osha";
public static final String COLUMN_COMPOUND = "compound";
public static final String COLUMN_H = "h";
public static final String COLUMN_F = "f";
public static final String COLUMN_R = "r";
public static final String COLUMN_SN = "sn";

public DataBaseHelper(Context context, String name,
                   SQLiteDatabase.CursorFactory factory, int version) {
    super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {

    String CREATE_OSHA_TABLE = "CREATE TABLE " +
            TABLE_OSHA + "("
            + COLUMN_COMPOUND + " TEXT," + COLUMN_H
            + " TEXT," + COLUMN_F + " TEXT," + COLUMN_R + " TEXT," + COLUMN_SN + " TEXT" + ")";
    db.execSQL(CREATE_OSHA_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
                      int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_OSHA);
    onCreate(db);
}
public Compound findCompound(String compoundname) {
    String query = "Select * FROM " + TABLE_OSHA + " WHERE " + COLUMN_COMPOUND + "= '" + compoundname + "'";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query, null);
    Compound compound = new Compound();
    if (cursor.moveToFirst()) {
        cursor.moveToFirst();
        compound.setH(cursor.getString(0));
        compound.setF(cursor.getString(1));
        compound.setR(cursor.getString(2));
        compound.setSN(cursor.getString(3));
       // cursor.moveToNext();
        cursor.close();
    } else {
        compound = null;
    }
    db.close();
    return compound;
}
}

这是我的复合类:

public class Compound {

private String  _compound;
private String _h;
private String _f;
private String _r;
private String _sn;

public Compound() {

}

    public Compound(String compound, String h, String f, String r, String sn) {
    this._compound = compound;
    this._h = h;
    this._f = f;
    this._r = r;
    this._sn = sn;
}

public Compound(String h, String f, String r, String sn) {
    this._h = h;
    this._f = f;
    this._r = r;
    this._sn = sn;
}

public void setCompound(String compound) {
    this._compound = compound;
}

public String getCompound() {
    return this._compound;
}

public void setH(String h) {
    this._h = h;
}

public String getH() {
    return this._h;
}

public void setF(String f) {
    this._f = f;
}

public String getF() {
    return this._f;
}
public void setR(String r) {
    this._r = r;
}
public String getR(){
    return this._r;
}
public void setSN(String sn){
    this._sn = sn;
}
public String getSN(){
    return this._sn;
}
}

这是我的主要类(class):

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class oshaSearch extends AppCompatActivity {
TextView txtH;
TextView txtR;
TextView txtF;
TextView txtSN;
EditText txtCompound;
Button btnSearch;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_osha_search);
    txtF = (TextView) findViewById(R.id.txtF);
    txtR = (TextView) findViewById(R.id.txtR);
    txtH = (TextView) findViewById(R.id.txtH);
    txtSN = (TextView) findViewById(R.id.txtSN);
    txtCompound = (EditText) findViewById(R.id.searchCompound);
    btnSearch = (Button) findViewById(R.id.btnSearch);
}
public void lookupCompound (View view) {
    DataBaseHelper dbHandler = new DataBaseHelper(this, null, null, 1);

    Compound compound =
            dbHandler.findCompound(txtCompound.getText().toString());

    if (compound != null) {
        txtH.setText(String.valueOf(compound.getH()));
        txtF.setText(String.valueOf(compound.getF()));
        txtR.setText(String.valueOf(compound.getR()));
        txtSN.setText(String.valueOf(compound.getSN()));
    } else {
        txtH.setText("No Match Found");
    }
}
}

非常感谢任何帮助。请帮帮我。 附加信息:数据库位于 Assets 文件夹中,数据库中的所有值都是文本字段,用户正在按复合名称搜索,数据库具有 .sqlite 扩展名。先谢谢大家。

最佳答案

您必须将您所说的位于 Assets 文件夹中的数据库复制到新创建的数据库中-

 private void copyDataBase(String dbname) throws IOException {
        // Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(dbname);
        // Path to the just created empty db
        String outFileName = getDatabasePath(dbname);
        // Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);
        // transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
        // Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

关于java - 预填充的 SQLite 数据库无法在 Android Studio 中正确读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36162173/

相关文章:

java - java中Stack和Queue的内存是如何分配的

java - 如何更改 XML 模式中类的访问修饰符

java - Android线程在进程中间随机停止

用于订阅/发布 MQTT(真正的小型消息代理)的 C# 客户端库

database - 如何使用 R DBI 的 dbWriteTable() 将二进制数据写入 SQLite?

java - 使用 Java 的 Collections.singletonList()?

Android Studio 卡在打开项目中?

java - 如何使用 Smack 将 XMPP 消息从 Android 发送到 GAE

c# - 将oracle数据库同步到一种本地数据库

php - 将选定的复选框下拉值发送到 Codeigniter 中的 MySQL 表