Kodhjälp: Databas och listor

Diskussion i 'Frågor, support och diskussion' startad av sika, 18 mars 2011.

  1. sika

    sika Baby Droid Medlem

    Blev medlem:
    25 februari 2011
    Inlägg:
    17
    Mottagna gillanden:
    0

    MINA ENHETER

    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);	
    	}
    
    }
     
  2. woody

    woody Teen Droid Medlem

    Blev medlem:
    3 september 2009
    Inlägg:
    319
    Mottagna gillanden:
    19

    MINA ENHETER

    Products instansvariabel dbHelper sätts ingenstans vad jag kan se därav NullPointerExceptionet

    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(Produ cts.java:26)
     
  3. sika

    sika Baby Droid Medlem

    Blev medlem:
    25 februari 2011
    Inlägg:
    17
    Mottagna gillanden:
    0

    MINA ENHETER

    Helt rätt, tack! :) haha kul det där att man slita sig i håret i timmarvis och sen lösa det med ett par knapptryck så där.

    Jag har nog inte heller förstått hur jag måste behandla databaser relaterade till flera aktiviteter (stänga/öppna databas och pausa, stänga, öppna aktiviteter och dylikt). Någon som snabbt kan berätta hur det generellt fungerar?
    Antar att detta beror på hur man vill göra, om man faktiskt vill uppdatera databasen mellan aktiviteter eller om man bara vill öppna den en gång (vid start) och sedan låta alla aktiviteter dela den?