2012-12-24 1 views
0

나는 내 머리를 쾅쾅 대고 있습니다. 나는 이것을 알아낼 수 없다. 내가하고 싶은 일은 활동이 생성 될 때 listview에 내 SQLite 데이터베이스의 항목이 채워지는 것입니다.nullpointerexception 및 데이터베이스가 생성되지 않습니다.

어쩌면 나는 작은 것을 놓치고 있는데, 나는이 시점에서 전혀 모른다. 그리고 좌절감을 넘어서기도한다. 나는 그것이 파일 탐색기에 존재하지 않기 때문에 데이터베이스가 생성되지 않는다는 것을 안다.

package com.dd.gfit; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DatabaseHandler extends SQLiteOpenHelper { 

    private SQLiteDatabase db; 

    // database strings 
    public static final String DATABASE_NAME = "gfit.db"; 
    public static final int DATABASE_VERSION = 1; 

    // table strings 
    public static final String TABLE_ROUTINES = "routines"; 

    // key strings 
    public static final String KEY_ROUTINES_ID = "id"; 
    public static final String KEY_ROUTINES_NAME = "name"; 

    public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

     // create routines table 
     db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_ROUTINES + " (" 
        + KEY_ROUTINES_ID + " INTEGER PRIMARY KEY AUTO_INCREMENT," 
        + KEY_ROUTINES_NAME + " VARCHAR" 
        + ")"); 

     // insert test data into routines table 
     db.execSQL("INSERT INTO " + TABLE_ROUTINES + " (" + KEY_ROUTINES_NAME + ") VALUES ('Test Routine 1')"); 
     db.execSQL("INSERT INTO " + TABLE_ROUTINES + " (" + KEY_ROUTINES_NAME + ") VALUES ('Test Routine 2')"); 
     db.execSQL("INSERT INTO " + TABLE_ROUTINES + " (" + KEY_ROUTINES_NAME + ") VALUES ('Test Routine 3')"); 
     db.execSQL("INSERT INTO " + TABLE_ROUTINES + " (" + KEY_ROUTINES_NAME + ") VALUES ('Test Routine 4')"); 
     db.execSQL("INSERT INTO " + TABLE_ROUTINES + " (" + KEY_ROUTINES_NAME + ") VALUES ('Test Routine 5')"); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // do database upgrades here 
    } 

    public Cursor fetchRoutines() { 
     Cursor cursor = db.query(TABLE_ROUTINES, new String[] {KEY_ROUTINES_ID, KEY_ROUTINES_NAME}, null, null, null, null, null); 

     if (cursor != null) { 
      cursor.moveToFirst(); 
     } 

     return cursor; 
    } 

} 
여기

RoutinesActivity.java이다 : 여기서

는 DatabaseHandler.java이다

package com.dd.gfit; 

import android.os.Bundle; 
import android.app.Activity; 
import android.database.Cursor; 
import android.support.v4.app.NavUtils; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 

public class RoutinesActivity extends Activity { 

    private DatabaseHandler db = new DatabaseHandler(this); 
    private Cursor cursor = db.fetchRoutines(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_routines); 

     // Show the Up button in the action bar. 
     getActionBar().setDisplayHomeAsUpEnabled(true); 

     // open the database and show the routines 
     db.getWritableDatabase(); 
     displayRoutines(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.activity_routines, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      NavUtils.navigateUpFromSameTask(this); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void displayRoutines() { 

     ListAdapter adapter = new SimpleCursorAdapter(
      this, 
      R.layout.listitem_routine, cursor, 
      new String[] { db.KEY_ROUTINES_NAME }, 
      new int[] { R.id.listitem_routine_name }); 

     ListView routineList = (ListView)findViewById(R.id.list_routines); 
     routineList.setAdapter(adapter); 
    } 

} 
여기

activity_routines.xml이다

: 여기

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".RoutinesActivity" > 

    <ListView 
     android:id="@+id/list_routines" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"   
     android:layout_margin="10dp" > 

    </ListView> 

</RelativeLayout> 

가있다 listitem_routine.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    android:gravity="center_vertical" > 

    <TextView 
     android:id="@+id/listitem_routine_name" 
     android:layout_width="0dip" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="@string/lorem_routine_item" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <ImageView 
     android:id="@+id/button_routine_edit" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_action_edit" 
     android:contentDescription="@string/ic_action_edit" /> 

    <ImageView 
     android:id="@+id/button_routine_delete" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_action_delete" 
     android:contentDescription="@string/ic_action_delete" /> 

</LinearLayout> 

무엇이 잘못 되었나요? 또한 일단이 작업을하면 listitem_routine.xml에서 볼 수있는 것처럼 각 목록보기 항목 내에 버튼이 있습니다. 어떻게 든 KEY_ROUTINES_ID를 버튼에 전달하여 각 항목을 즉시 편집 할 수 있습니다. 누구나 사용할 수있는 자습서가 있습니까 아니면 스 니펫 만 알고 있습니까?

편집 : 다음 줄에

12-24 02:52:24.429: D/dalvikvm(783): GC_FOR_ALLOC freed 49K, 7% free 2564K/2732K, paused 68ms, total 69ms 
12-24 02:52:24.449: I/dalvikvm-heap(783): Grow heap (frag case) to 3.616MB for 1048592-byte allocation 
12-24 02:52:24.559: D/dalvikvm(783): GC_FOR_ALLOC freed 2K, 5% free 3585K/3760K, paused 110ms, total 110ms 
12-24 02:52:24.659: D/dalvikvm(783): GC_CONCURRENT freed <1K, 5% free 3585K/3760K, paused 5ms+3ms, total 102ms 
12-24 02:52:24.839: D/dalvikvm(783): GC_FOR_ALLOC freed <1K, 5% free 3585K/3760K, paused 51ms, total 51ms 
12-24 02:52:24.869: I/dalvikvm-heap(783): Grow heap (frag case) to 5.863MB for 2359312-byte allocation 
12-24 02:52:24.989: D/dalvikvm(783): GC_CONCURRENT freed 0K, 3% free 5889K/6068K, paused 24ms+33ms, total 115ms 
12-24 02:52:25.319: D/gralloc_goldfish(783): Emulator without GPU emulation detected. 
12-24 02:52:31.950: E/Trace(827): error opening trace file: No such file or directory (2) 
12-24 02:52:32.660: D/dalvikvm(827): GC_FOR_ALLOC freed 52K, 7% free 2564K/2736K, paused 25ms, total 28ms 
12-24 02:52:32.670: I/dalvikvm-heap(827): Grow heap (frag case) to 3.616MB for 1048592-byte allocation 
12-24 02:52:32.710: D/dalvikvm(827): GC_FOR_ALLOC freed 2K, 5% free 3585K/3764K, paused 40ms, total 40ms 
12-24 02:52:32.760: D/dalvikvm(827): GC_CONCURRENT freed <1K, 5% free 3585K/3764K, paused 5ms+3ms, total 50ms 
12-24 02:52:32.840: D/dalvikvm(827): GC_FOR_ALLOC freed <1K, 5% free 3585K/3764K, paused 19ms, total 19ms 
12-24 02:52:32.860: I/dalvikvm-heap(827): Grow heap (frag case) to 5.863MB for 2359312-byte allocation 
12-24 02:52:33.000: D/dalvikvm(827): GC_CONCURRENT freed 0K, 4% free 5889K/6072K, paused 77ms+13ms, total 140ms 
12-24 02:52:33.250: D/gralloc_goldfish(827): Emulator without GPU emulation detected. 
12-24 02:52:36.120: D/AndroidRuntime(827): Shutting down VM 
12-24 02:52:36.140: W/dalvikvm(827): threadid=1: thread exiting with uncaught exception (group=0x40a70930) 
12-24 02:52:36.190: E/AndroidRuntime(827): FATAL EXCEPTION: main 
12-24 02:52:36.190: E/AndroidRuntime(827): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.dd.gfit/com.dd.gfit.RoutinesActivity}: java.lang.NullPointerException 
12-24 02:52:36.190: E/AndroidRuntime(827): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106) 
12-24 02:52:36.190: E/AndroidRuntime(827): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
12-24 02:52:36.190: E/AndroidRuntime(827): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
12-24 02:52:36.190: E/AndroidRuntime(827): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
12-24 02:52:36.190: E/AndroidRuntime(827): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-24 02:52:36.190: E/AndroidRuntime(827): at android.os.Looper.loop(Looper.java:137) 
12-24 02:52:36.190: E/AndroidRuntime(827): at android.app.ActivityThread.main(ActivityThread.java:5039) 
12-24 02:52:36.190: E/AndroidRuntime(827): at java.lang.reflect.Method.invokeNative(Native Method) 
12-24 02:52:36.190: E/AndroidRuntime(827): at java.lang.reflect.Method.invoke(Method.java:511) 
12-24 02:52:36.190: E/AndroidRuntime(827): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
12-24 02:52:36.190: E/AndroidRuntime(827): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
12-24 02:52:36.190: E/AndroidRuntime(827): at dalvik.system.NativeStart.main(Native Method) 
12-24 02:52:36.190: E/AndroidRuntime(827): Caused by: java.lang.NullPointerException 
12-24 02:52:36.190: E/AndroidRuntime(827): at com.dd.gfit.DatabaseHandler.fetchRoutines(DatabaseHandler.java:51) 
12-24 02:52:36.190: E/AndroidRuntime(827): at com.dd.gfit.RoutinesActivity.<init>(RoutinesActivity.java:17) 
12-24 02:52:36.190: E/AndroidRuntime(827): at java.lang.Class.newInstanceImpl(Native Method) 
12-24 02:52:36.190: E/AndroidRuntime(827): at java.lang.Class.newInstance(Class.java:1319) 
12-24 02:52:36.190: E/AndroidRuntime(827): at android.app.Instrumentation.newActivity(Instrumentation.java:1054) 
12-24 02:52:36.190: E/AndroidRuntime(827): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097) 
12-24 02:52:36.190: E/AndroidRuntime(827): ... 11 more 
+0

로그 인 가장 중요한 정보를 업로드하는 것을 잊었습니다. – wtsang02

+0

로그에 내 OP를 업데이트 중입니다. – scarhand

+0

@scarhand : 자신의'Activity'에서'DatabaseHandler'를'db'로 이름 짓지 만,'db'는 실제 데이터베이스를 나타내는 코드의 다른 곳에서 사용됩니다. 'DatabaseHandler' 인스턴스의 이름을'dbh' 또는'db'가 아닌 다른 이름으로 변경하십시오. – Squonk

답변

1
private DatabaseHandler db = new DatabaseHandler(this); 
private Cursor cursor = db.fetchRoutines(); 

아직 onCreate()를 호출하지 않았기 때문에이 작업을 호출 할 수 없습니다) (다음

private DatabaseHandler db; 


    @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_routines); 
    db = new DatabaseHandler(this); 

     } 

은 또한에서 onCreate에 다음 줄을 이동 마십시오. db.fetchRoutines();는 db에서 무언가를 호출합니다. 하지만 db 객체를 만들었습니다. 객체가 아직 구성되지 않았으므로 'this'를 사용할 수 없습니다.

private DatabaseHandler db = null; 
    private Cursor cursor = null; 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_routines); 

     // Show the Up button in the action bar. 
     getActionBar().setDisplayHomeAsUpEnabled(true); 

     // open the database and show the routines 
     db = new DatabaseHandler(this); 
     db.getWritableDatabase(); 

     cursor = db.fetchRoutines(); 
     displayRoutines(); 
    } 

이 방법

db = new DatabaseHandler(this); 

는 개체를 만들 수있는 곳입니다.

db.getWritableDatabase(); 

은 db를 얻는 곳으로,이 행 다음에 db 조작 만 사용할 수 있습니다.

+0

어떻게 DatabaseHandler에 대해 oncreate를 적절하게 호출합니까? 이것이 문제 여야합니다. 데이터베이스를 생성하지 않으므로 데이터베이스를 호출하지 않습니다. – scarhand

+0

거기에 null 선언 onCreate() 위의 작업을 수행하지 않고 어떤 식 으로든 할 수 있습니까? 아니면 클래스의 다른 함수 내에서 사용할 수 있도록이 방식으로해야합니까? – scarhand

+0

또 다른 방법은 다른 함수에 대한 참조를 params로 전달하는 것이지만 null 선언으로 설정하는 것이 더 쉬워 보입니다. – wtsang02

1

this 키워드가 충돌하는 이유입니다 : 여기

로그입니다. 개체 생성 전에 'this'키워드를 사용하고 있습니다.

private DatabaseHandler db = new DatabaseHandler(this); 

private Cursor cursor = db.fetchRoutines(); 
1

DatabaseHandler에는 db 값을 할당하지 마십시오. 따라서 에서 db.query()으로 전화하면 충돌이 발생합니다.

db 멤버 변수를 설정해야 나중에 사용할 수 있습니다. DatabaseHandler.onCreate() 끝에 다음 줄을 추가하십시오.

this.db = db;