私の 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」と表示される
これらのコードの何が問題なのか、誰でも説明できますか。
事前にサンクス