M
mogschieler
Neues Mitglied
- 0
Hallo Leute,
ich bin neu hier und auch recht neu in der APP Entwicklung.
Ich habe ein Problem mit dem SQLiteOpenHelper.
Ich habe mir folgendes gedacht, nach dem starten der APP wird in der MainActivity onCreate Methode der SQLiteOpenHelper initialisiert und erstellt. Dieser wird dann aufgerufen, wenn keine Datenbank besteht, wird die onCreate Funktion aufgerufen, die Datenbank erstellt, die Tabellen erstellt und die Initialisierungsdaten aus der XML ausgelesen und eingefügt und genau da besteht der Fehler.
Rufe ich allerdings die Funktion
aus dem try catch block aus der onCreate Funktion auf, dann funkioniert es jedoch.
Dabei ist doch die insertRow(...) Funktion in der gleichen Klasse.
Vielleicht kann ja jemand helfen?
Hier die Codebeispiele:
MainActivity:
MyDBHelper:
Logcat:
Der ursprüngliche Beitrag von 18:57 Uhr wurde um 19:24 Uhr ergänzt:
Problem gelöst.
Wenn die APP das erste mal startet, dann existiert noch keine Datenbank, so kann sie nicht zum schreiben geöffnet werden und die Variable db in der Klasse ist noch null, da erst der konstruktor der Superklasse aufgerufen wird und dann die onCreate Methode zum erstellen der Datenbank. erst dann wird die db Variable zugewiesen.
ich bin neu hier und auch recht neu in der APP Entwicklung.
Ich habe ein Problem mit dem SQLiteOpenHelper.
Ich habe mir folgendes gedacht, nach dem starten der APP wird in der MainActivity onCreate Methode der SQLiteOpenHelper initialisiert und erstellt. Dieser wird dann aufgerufen, wenn keine Datenbank besteht, wird die onCreate Funktion aufgerufen, die Datenbank erstellt, die Tabellen erstellt und die Initialisierungsdaten aus der XML ausgelesen und eingefügt und genau da besteht der Fehler.
Rufe ich allerdings die Funktion
Code:
db.insert(TABLE_NAME, null, contentValues);
Dabei ist doch die insertRow(...) Funktion in der gleichen Klasse.
Vielleicht kann ja jemand helfen?
Hier die Codebeispiele:
MainActivity:
Code:
public class MainActivity extends Activity implements OnClickListener{
private MyDBHelper mydbhelper;
// <...>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// <...>
mydbhelper = new MyDBHelper(this, "dbase.db");
}
}
MyDBHelper:
Code:
public class MyDBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "dbase.db";
private static final int DATABASE_VERSION = 1;
private SQLiteDatabase db;
private Context mContext;
public MyDBHelper(Context activity, String dbname) {
super(activity, DATABASE_NAME, null, DATABASE_VERSION);
this.mContext = activity;
db = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
String sql = "CREATE TABLE catalog " +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"catalog_name TEXT, " +
"catalog_description TEXT)";
db.execSQL(sql);
Log.d("MyDBHelper", "Table 'catalog' created");
} catch (Exception ex) {
Log.e("MyDBHelper", ex.getMessage());
}
XmlResourceParser xpp = mContext.getResources().getXml(R.xml.xmlfile);
try {
getXMLfromResource(xpp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("DBHelper", e.getMessage(), e);
e.toString();
} catch (XmlPullParserException e) {
e.printStackTrace();
Log.e("DBHelper", e.getMessage(), e);
} finally {
xpp.close();
}
}
public long insertRow(String TABLE_NAME, ContentValues contentValues){
Log.d("MyDBHelper", "inserting data with insertRow()");
try {
return db.insert(TABLE_NAME, null, contentValues); // <----- Here is the error
} catch(Exception e) {
Log.d("MyDBHelper", e.getMessage());
return -1;
}
}
private void getXMLfromResource(XmlResourceParser xpp) throws IOException, XmlPullParserException {
ContentValues contentValues = new ContentValues();
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if(eventType == XmlPullParser.START_DOCUMENT) {
} else if(eventType == XmlPullParser.START_TAG) {
xpp.getName();
if( xpp.getName().equals("catalog")) {
// just an example
contentValues.put("catalog_name", "Catalog Name");
contentValues.put("catalog_description", "Catalog Description");
insertRow("catalog", contentValues);
contentValues.clear();
}
} else if(eventType == XmlPullParser.END_TAG) {
} else if(eventType == XmlPullParser.TEXT) {
}
eventType = xpp.next();
}
xpp.close();
}
}
Logcat:
Code:
07-02 10:00:47.900: D/AndroidRuntime(1391): Shutting down VM
07-02 10:00:47.900: W/dalvikvm(1391): threadid=1: thread exiting with uncaught exception (group=0xb1ad4ba8)
07-02 10:00:47.940: E/AndroidRuntime(1391): FATAL EXCEPTION: main
07-02 10:00:47.940: E/AndroidRuntime(1391): Process: com.example.example, PID: 1391
07-02 10:00:47.940: E/AndroidRuntime(1391): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.example/com.example.example.MainActivity}: java.lang.NullPointerException: println needs a message
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.app.ActivityThread.access$800(ActivityThread.java:135)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.os.Handler.dispatchMessage(Handler.java:102)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.os.Looper.loop(Looper.java:136)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.app.ActivityThread.main(ActivityThread.java:5017)
07-02 10:00:47.940: E/AndroidRuntime(1391): at java.lang.reflect.Method.invokeNative(Native Method)
07-02 10:00:47.940: E/AndroidRuntime(1391): at java.lang.reflect.Method.invoke(Method.java:515)
07-02 10:00:47.940: E/AndroidRuntime(1391): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-02 10:00:47.940: E/AndroidRuntime(1391): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-02 10:00:47.940: E/AndroidRuntime(1391): at dalvik.system.NativeStart.main(Native Method)
07-02 10:00:47.940: E/AndroidRuntime(1391): Caused by: java.lang.NullPointerException: println needs a message
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.util.Log.println_native(Native Method)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.util.Log.d(Log.java:139)
07-02 10:00:47.940: E/AndroidRuntime(1391): at com.example.example.data.MyDBHelper.insertRow(MyDBHelper.java:140)
07-02 10:00:47.940: E/AndroidRuntime(1391): at com.example.example.data.MyDBHelper.getXMLfromResource(MyDBHelper.java:165)
07-02 10:00:47.940: E/AndroidRuntime(1391): at com.example.example.data.MyDBHelper.onCreate(MyDBHelper.java:99)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
07-02 10:00:47.940: E/AndroidRuntime(1391): at com.example.example.data.MyDBHelper.<init>(MyDBHelper.java:32)
07-02 10:00:47.940: E/AndroidRuntime(1391): at com.example.example.MainActivity.onCreate(MainActivity.java:54)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.app.Activity.performCreate(Activity.java:5231)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
07-02 10:00:47.940: E/AndroidRuntime(1391): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
Der ursprüngliche Beitrag von 18:57 Uhr wurde um 19:24 Uhr ergänzt:
Problem gelöst.
Wenn die APP das erste mal startet, dann existiert noch keine Datenbank, so kann sie nicht zum schreiben geöffnet werden und die Variable db in der Klasse ist noch null, da erst der konstruktor der Superklasse aufgerufen wird und dann die onCreate Methode zum erstellen der Datenbank. erst dann wird die db Variable zugewiesen.