Tjena,
Har nyligen börjat med Android. Första gången jag ber om kodhjälp här, lite osäker på hur jag postar den.
Har stött på problem jag inte kan lösa: Jag försöker displaya en databas genom en listvy.
Jag har tre klasser: en main (listvy), en produktlista (listvy) samt en klass som definerar databasen.
Tanken är första activiteten (main) och klassen ska se till att databasen skapas eller öppnas genom att "kalla på den". Här lägger jag också en rad i databasen.
Härifrån "går" jag sedan till aktiviteten Products som ska displaya tabellerna i databasen - då kraschar programmet.
Problemet verkar inträffa vid
"Cursor c = dbHelper.fetchAllNotes();" och den medföljande raden "return mDb.rawQuery("SELECT * FROM products", null);"
Felmeddelandet säger mig tyvärr ingenting (nedan). Hjälp uppskattad!
03-18 22:54:00.495: INFO/ActivityManager(52): Starting activity: Intent { cmp=com.malvacom.test_1_mainui/.Products }
03-18 22:54:10.525: WARN/ActivityManager(52): Launch timeout has expired, giving up wake lock!
03-18 22:54:10.596: WARN/ActivityManager(52): Activity idle timeout for HistoryRecord{438ab608 com.malvacom.test_1_mainui/.Products}
03-18 22:54:43.985: DEBUG/AndroidRuntime(1022): Shutting down VM
03-18 22:54:43.985: WARN/dalvikvm(1022): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
03-18 22:54:45.595: ERROR/AndroidRuntime(1022): Uncaught handler: thread main exiting due to uncaught exception
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.malvacom.test_1_mainui/com.malvacom.test_1_mainui.Products}: java.lang.NullPointerException
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at android.os.Handler.dispatchMessage(Handler.java:99)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at android.os.Looper.loop(Looper.java:123)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at android.app.ActivityThread.main(ActivityThread.java:4203)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at java.lang.reflect.Method.invokeNative(Native Method)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at java.lang.reflect.Method.invoke(Method.java:521)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at dalvik.system.NativeStart.main(Native Method)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): Caused by: java.lang.NullPointerException
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at com.malvacom.test_1_mainui.Products.fillData(Products.java:26)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at com.malvacom.test_1_mainui.Products.onCreate(Products.java:19)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
03-18 22:54:45.695: ERROR/AndroidRuntime(1022): ... 11 more
03-18 22:54:45.825: INFO/Process(52): Sending signal. PID: 1022 SIG: 3
Database class
HTML:
package com.example.test_1_mainui;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBDef
{
public static final String KEY_ROWID = "_id";
public static final String KEY_TITLE = "title";
public static final String KEY_BODY = "body";
public static final String KEY_KEY = "sp_key";
public static final String KEY_TIMESTAMP = "sp_timestamp";
private static final String TAG = "NotesDbAdapter";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
/** Database creation sql statement */
private static final String DATABASE_CREATE = "CREATE TABLE IF NOT EXISTS products (_id integer primary key autoincrement, title VARCHAR not null, body VARCHAR not null, sp_key VARCHAR, sp_timestamp VARCHAR);";
private static final String DATABASE_NAME = "dbMalva";
private static final String DATABASE_TABLE = "products";
private static final int DATABASE_VERSION = 1;
private final Context mCtx;
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS products");
onCreate(db);
}
}
/** Constructor - takes the context to allow the database to be
* opened/created
*
* @param ctx the Context within which to work */
public DBDef(Context ctx)
{
this.mCtx = ctx;
}
/** Open the notes database. If it cannot be opened, try to create a new
* instance of the database. If it cannot be created, throw an exception to
* signal the failure
*
* @return this (self reference, allowing this to be chained in an
* initialization call)
* @throws SQLException if the database could be neither opened or created */
public DBDef open() throws SQLException
{
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close()
{
mDbHelper.close();
}
public long createNote(String title, String body)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_BODY, body);
return mDb.insert(DATABASE_TABLE, null, initialValues);
}
public Cursor fetchAllNotes()
{
return mDb.rawQuery("SELECT * FROM products", null);
}
}
Main
HTML:
package com.example.test_1_mainui;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class Test_1_mainUI extends ListActivity
{
private int mNoteNumber = 1;
private DBDef dbHelper;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
dbHelper = new DBDef(this);
dbHelper.open();
String[] list_optionsArray = getResources().getStringArray(
R.array.list_array_main);
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item_main,
list_optionsArray)); // Stores the list
ListView lv = getListView(); // imports the list from ListAdapter to
// show list
dbHelper.createNote("testTitle", "testBody");
lv.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
switch (position)
{
case 0: // Products
Intent intentCAProducts = new Intent(view.getContext(),
Products.class);
startActivity(intentCAProducts);
break;
}
}
});
//dbHelper.close();
}
}
Products
HTML:
package com.example.test_1_mainui;
import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.SimpleCursorAdapter;
public class Products extends ListActivity
{
private int mNoteNumber = 1;
private DBDef dbHelper;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.list_item_products);
fillData();
}
public void fillData()
{
Cursor c = dbHelper.fetchAllNotes();
startManagingCursor(c);
String[] from = new String[] { DBDef.KEY_TITLE };
int [] to = new int[] {R.id.row_layout};
SimpleCursorAdapter products = new SimpleCursorAdapter(this, R.layout.products_row, c, from, to);
setListAdapter(products);
}
}