Android - öffnen der SQLite-Datenbank
Ich möchte beim öffnen einer Datenbank und abrufen von Daten aus es. Ich lese ein tutorial über diese und einen Antrag gestellt. Ich bin versucht, um zu überprüfen, ob die Datenbank existiert, wenn nicht, erstellen Sie eine neue db in der Android-Standard-system-Pfad der Anwendung, die Datenbank und kopieren Sie die Daten aus einer db gibt (was ist in dem Ordner "assets"). Aber wenn ich die Anwendung ausführen, bekam ich die Fehlermeldung:
SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase$CursorFactory, String, String[], String) line: 1568
Kann jemand geben Sie mir einige Ratschläge über das, was habe ich falsch gemacht? Hier ist der code:
package thesis.app.quiz;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelperForQuiz extends SQLiteOpenHelper {
//The Android's default system path of your application database.
private static String DB_PATH = "/data/data/thesis.app.quiz/databases/";
private static String DB_NAME = "QuizDB";
private SQLiteDatabase myDataBase;
private final Context myContext;
public DBHelperForQuiz(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void openDataBase() {
String myDbPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myDbPath, null,
SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}
public List<Question> getQuestionsList(int difficulty, int numberOfQuestions) {
List<Question> questionsList = new ArrayList<Question>();
Cursor c = myDataBase.rawQuery("SELECT * FROM questions", null);
while (c.moveToNext()) {
Question q = new Question();
q.setQuestionText(c.getString(1));
q.setRightAnswer(c.getString(2));
q.setAnswerOption1(c.getString(3));
q.setAnswerOption2(c.getString(4));
q.setAnswerOption3(c.getString(5));
q.setQuestionDiffLevel(difficulty);
questionsList.add(q);
}
return questionsList;
}
public void createDataBase() throws IOException {
if (!checkIfDBAlredyExist()) {
this.getReadableDatabase();
try {
InputStream myInput = myContext.getAssets().open(DB_NAME);
String newDbPath = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(newDbPath);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
} catch (IOException e) {
e.printStackTrace();
throw new Error("Error copying database");
}
}
}
public boolean checkIfDBAlredyExist() {
SQLiteDatabase tmpDb = null;
String dbPath = DB_PATH + DB_NAME;
try {
tmpDb = SQLiteDatabase.openDatabase(dbPath, null,
SQLiteDatabase.OPEN_READONLY);
} catch (SQLException e) {
e.printStackTrace();
}
if (tmpDb != null) {
tmpDb.close();
//return true;
}
return tmpDb != null ? true : false;
}
}
Dieser sieht nicht wie der tatsächliche Fehler, können Sie die post mehr von der stacktrace?
Poste bitte LogCat Ausgabe
Sorry, für die späte Antwort. Ich bin gerettet die LogCat-Ausgabe, und ich bin etwas bemerkt, so dass ich versuche herauszufinden, etwas. Vielleicht kann ich dieses problem lösen. Ich will nicht Ihre Zeit verschwenden. Wenn ich wieder scheitern, werde ich kopiere das log hier.
Ich scheiterte wieder. Ich update das problem.
Poste bitte LogCat Ausgabe
Sorry, für die späte Antwort. Ich bin gerettet die LogCat-Ausgabe, und ich bin etwas bemerkt, so dass ich versuche herauszufinden, etwas. Vielleicht kann ich dieses problem lösen. Ich will nicht Ihre Zeit verschwenden. Wenn ich wieder scheitern, werde ich kopiere das log hier.
Ich scheiterte wieder. Ich update das problem.
InformationsquelleAutor user1036555 | 2012-03-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht zu tun.
Die Schönheit der SQLiteOpenHelper übergeordneten Klasse ist, dass es automatisch überprüft, ob die Datenbank bereits existiert oder nicht.
Einem Aufruf von getReadableDatabase() oder getWritableDatabase() die folgenden vor der Rückgabe einer lesbaren oder beschreibbaren SQLiteDatabase-Objekt:
InformationsquelleAutor Gilbert Kuo
kopieren Sie diese in der Klasse
hier die db das Objekt ist, das von SQLiteDatabase.
stellen Sie sicher, dass der name Ihrer Datenbank ist dieselbe, wie Sie schreiben in Ihrem code(Klasse).
InformationsquelleAutor Munjal Upadhyay