0

在我的 Android 应用程序中,我使用 sqlite 浏览器创建了一个数据库并将其 cpoied 到资产文件夹中。然后我创建了一个名为 EMPerson 的表。当用户单击保存按钮时,我需要将用户定义的数据(用户可以在此 EMPerson 表中插入详细信息,例如 personName、date_of_birth、age、gender 和 bloodGrp)。

我的 DBHelper 类是这样的。

package my.easymedi.db;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import my.easymedi.entity.Person;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;

public class DBHelper extends SQLiteOpenHelper {

/*Database attributes - the Android's default system path for your application database*/
private static final String pkg = "my.easymedi.controller";
private static String DB_PATH = "/data/data/" + pkg + "/databases/";
private static String DB_NAME = "EasyMediInfo.jpeg";
private static final int DB_VERSION = 1;

private final Context myContext;
private SQLiteDatabase myDatabase; 

public DBHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
    this.myContext = context;
}

public void createDataBase() {
    boolean dbExist = checkDataBase();
    if (dbExist) {
        // do nothing - database already exist
    } else {
        this.getReadableDatabase();
        try {
            copyDataBase();
        } catch (IOException e) {
            Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT).show();
            Log.d("CREATE_DB", e.getMessage());
        }
    }
}

private void copyDataBase() throws IOException {
    InputStream databaseInput = null;
    String outFileName = DB_PATH + DB_NAME;     //path to copy the database
    OutputStream databaseOutput = new FileOutputStream(outFileName);    //open the empty db as an output stream

    databaseInput = myContext.getAssets().open(DB_NAME);

    byte[] buffer = new byte[512];
    int length = databaseInput.read(buffer);
    while(length > 0){  
        databaseOutput.write(buffer, 0, length);
        databaseOutput.flush();
    }
    databaseOutput.flush();
    databaseInput.close();
    databaseOutput.close();
}

private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    } catch (SQLiteException e) {
        Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT).show();
        Log.d("Check_DB", e.getMessage());
    }
    if (checkDB != null) {
        checkDB.close();
    }
    return checkDB != null ? true : false;
}

public void openDatabase() {
    String myPath = DB_PATH + DB_NAME;
    myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
}

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

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}

public boolean insertIntoDatabase(Person person) {

    String query = "INSERT INTO EMPerson (COLUMN_PERSON_NAME, COLUMN_DOB , COLUMN_AGE, COLUMN_GENDER, COLUMN_BLOODGRP) " 
                    + " VALUES ('" + person.getName() + "', '" + person.getDate_of_birth() + "', '" + person.getAge() + "', '" + person.getGender() + "', '" + person.getBloodGrp() + "')";
    try {
        myDatabase.execSQL(query);
        return true;
    } catch (Exception e) {
        return false;
    }
}

}

这是我的 AddNewPerson 类段。

@Override
public void onClick(View view) {
    switch (view.getId()) {

    case R.id.btnSave:
        personName = etName.getText().toString();
        date_of_birth = tvDOB.getText().toString();
        age = tvAge.getText().toString();

        int selected_rb_ID = genderGrp.getCheckedRadioButtonId();   
        RadioButton rb = (RadioButton) findViewById(selected_rb_ID);
        gender = rb.getText().toString();
        bloodGrp = spiBloodGrp.getSelectedItem().toString();

        Person person = new Person();
        person.setName(personName);
        person.setDate_of_birth(date_of_birth);
        person.setAge(age);
        person.setGender(gender);
        person.setBloodGrp(bloodGrp);
        //personArrayList.add(person);

        DBHelper dbHelper = new DBHelper(this);
        dbHelper.createDataBase();
        dbHelper.openDatabase();
        //SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
        boolean flag = dbHelper.insertIntoDatabase(person);
        //long affectedColumnId = sqliteDatabase.insert(AndroidOpenDbHelper.TABLE_NAME_GPA, null, contentValues);
        if(flag){
            Toast.makeText(getApplicationContext(), "Values inserted", Toast.LENGTH_SHORT).show();
        }

        dbHelper.closeDatabase();
        break;

当我运行应用程序日志时,猫说“没有这样的表:EMPerson”

谁能解释一下这些代码有什么问题。

提前感谢

4

2 回答 2

0

在 Assets中将 DB_NAME 更改为 EasyMediInfo.db

B/coz 数据库文件的扩展名是.db

私有静态字符串 DB_NAME = "EasyMediInfo.db";

编辑:-

public DBHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
    this.myContext = context;
if (android.os.Build.VERSION.SDK_INT >= 4.2) {
            DB_PATH = myContext.getApplicationInfo().dataDir
                    + "/databases/";
        } else {
            DB_PATH = "/data/data/" + myContext.getPackageName()
                    + "/databases/";
        }
}
于 2013-10-15T06:15:39.377 回答
0

似乎有两个问题:

  1. 将数据库的扩展名从“.jpeg”更改为“.db”(只是对良好编码实践的建议)

  2. 您似乎没有在代码中正确初始化“mydatabase”变量:

该行:

    checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);

应该调用 this.openDatabase(...)

同样,当您的数据库不存在时,您复制数据库但不会再次初始化 mydatabase(您应该再次调用 openDatabase)

此外,您可以将函数 openDatabase 修改为

public boolean openDatabase() {
    String myPath = DB_PATH + DB_NAME;
    myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);

    return myDatabase!= null ? true : false;

}
于 2013-10-15T06:21:07.657 回答