#android
#Android
Вопрос:
у меня есть некоторые проблемы в моей базе данных … вот сценарий
я хочу создать отдельную базу данных следующим образом
класс 1: объявить базу данных -> master.sqlite
класс 2: объявить запрос к базе данных в классе 1
класс 3: вызовите запрос из класса 2 и получите результат
в моем классе 1 я объявляю свою базу данных следующим образом
public class Database_Login extends SQLiteOpenHelper {
public static int iconPos;
private static String DB_NAME = "Master.sqlite";
private SQLiteDatabase loginDataBase;
private final Context myContext;
private static String DB_PATH;
public Database_Login(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
DB_PATH = "/data/data/" myContext.getApplicationContext().getPackageName() "/" "databases/";
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
} else {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
public boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE);
}
catch (SQLiteException e){
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
/**
* Copies your database from your local assets-folder to the just created
* empty database in the system folder, from where it can be accessed and
* handled. This is done by transfering bytestream.
* */
private void copyDataBase() throws IOException {
// Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH DB_NAME;
// 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();
}
public void openDataBase() throws SQLException {
// Open the database
String myPath = DB_PATH DB_NAME;
loginDataBase = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE);
}
@Override
public synchronized void close() {
if (loginDataBase != null)
loginDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
и во 2 классе я заявляю вот так
public class Login{
public static int iconPos;
Database_Login login;
SQLiteDatabase loginDataBase;
public Login(Context context) {
login = new Database_Login(context);
loginDataBase = login.getReadableDatabase();
}
public boolean cekLogin(String username, String password) throws SQLException {
login.openDataBase();
loginDataBase = login.getReadableDatabase();
Cursor mCursor = loginDataBase.rawQuery("SELECT * FROM tblUser WHERE UserName=? AND Password=?", new String[] { username, password});
if (mCursor != null) {
if (mCursor.getCount() > 0) {
return true;
}
}
login.close();
return false;
}
public String UserType(String username) throws SQLException{
login.openDataBase();
loginDataBase = login.getReadableDatabase();
String UserType = "";
Cursor mCursor = loginDataBase.rawQuery("SELECT UserType FROM tblUser WHERE UserName=?", new String[] { username });
if(mCursor.moveToFirst()){
UserType = mCursor.getString(mCursor.getColumnIndex("UserType"));
return UserType;
}
login.close();
return UserType;
}
public int checkIcon() {
switch (iconPos) {
case 0:
iconPos = R.drawable.ic_action_help;
break;
case 1:
iconPos = R.drawable.ic_action_good;
break;
case 2:
iconPos = R.drawable.ic_action_labels;
break;
case 3:
iconPos = R.drawable.ic_action_email;
break;
case 4:
iconPos = R.drawable.ic_action_gamepad;
break;
case 5:
iconPos = R.drawable.ic_action_search;
break;
case 6:
iconPos = R.drawable.ic_action_cloud;
break;
case 7:
iconPos = R.drawable.ic_action_camera;
break;
case 8:
iconPos = R.drawable.ic_action_video;
break;
case 9:
iconPos = R.drawable.ic_action_group;
break;
case 10:
iconPos = R.drawable.ic_action_import_export;
break;
case 11:
iconPos = R.drawable.ic_action_help;
break;
case 12:
iconPos = R.drawable.ic_action_about;
break;
case 13:
iconPos = R.drawable.ic_action_settings;
break;
case 14:
iconPos = R.drawable.ic_action_gamepad;
break;
case 15:
iconPos = R.drawable.ic_action_cloud;
break;
case 16:
iconPos = R.drawable.ic_action_camera;
break;
case 17:
iconPos = R.drawable.ic_action_video;
break;
case 18:
iconPos = R.drawable.ic_action_import_export;
break;
case 19:
iconPos = R.drawable.ic_action_about;
break;
case 20:
iconPos = R.drawable.ic_action_good;
break;
case 21:
iconPos = R.drawable.ic_action_gamepad;
break;
case 22:
iconPos = R.drawable.ic_action_cloud;
break;
default:
break;
}
return iconPos;
}
}
и в классе 3 я просто вызываю метод класса 2
но когда я его запускаю, в журнале cat указано, что tblUser не найден…
как я должен был сделать, чтобы заставить мою базу данных работать???
спасибо за вашу помощь…
Комментарии:
1. Прежде всего, проверьте, скопирована ли ваша база данных в data / данные или нет.
2. Где ваша ошибка logcat? Также опубликуйте ошибку logcat.
Ответ №1:
Вероятно, вы добавили таблицу после первой установки. Когда вы устанавливаете приложение для отладки, оно снова не копирует базу данных из ресурсов. Чтобы получить последнюю версию базы данных, вам нужно будет удалить приложение и выполнить новую установку.