0

私の Android アプリケーションでは、sqlite ブラウザーを使用してデータベースを作成し、アセット フォルダーにコピーしました。次に、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;

アプリケーション ログを実行すると、cat に「no such table:EMPerson」と表示される

これらのコードの何が問題なのか、誰でも説明できますか。

事前にサンクス

4

2 に答える 2

0

Assets で DB_NAME を EasyMediInfo.db に変更します。

B/coz データベース ファイルの拡張子は.dbです

private static String 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 に答える