2016-04-01 20 views
1

私はアンドロイドプログラミングで非常に新しいです。これはスタックオーバーフローに関する私の最初の質問です。コードの実装でどこが間違っているのかを理解することができません。私はデータベースにデータを格納し、それをarraylistに抽出しようとしています。アンドロイドデータベースからarraylistへデータを取得する方法

これは私がボタンonclicklistenerにデータベースにデータを追加するクラスである:

public class KarmaDescription extends AppCompatActivity { 

Button button; 
TasksDBHandler dbHandler; 
int tId = 1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_karma_desc2min); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setHomeButtonEnabled(true); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setTitle("Overview"); 

    button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      MyTasksGS myTask = new MyTasksGS(tId, "New Task Title", 2); 
      dbHandler.addTask(myTask); 
      Toast.makeText(KarmaDescription.this, "Task Added", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    int id = item.getItemId(); 

    if (id == android.R.id.home) { 
     onBackPressed(); 
    } 

    return super.onOptionsItemSelected(item); 
} 

}

これは、データベースを管理するクラスである:

public class TasksDBHandler extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_NAME = "tasks.db"; 
public static final String TABLE_TASKS = "tasks"; 
public static final String COLUMN_ID = "id"; 
public static final String COLUMN_TASKNAME = "taskname"; 
public static final String COLUMN_DAYSLEFT = "daysleft"; 

public TasksDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
    super(context, DATABASE_NAME, factory, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

    String query = "CREATE TABLE " + TABLE_TASKS + "(" + 
      COLUMN_ID + " INTEGER PRIMARY KEY," + 
      COLUMN_TASKNAME + " TEXT," + 
      COLUMN_DAYSLEFT + " INTEGER" + 
      ")"; 
    db.execSQL(query); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    db.execSQL("DROP TABLE IF EXISTS " + TABLE_TASKS); 
    onCreate(db); 
} 

//Add a new row to the database 
public void addTask(MyTasksGS myTask) { 

    ContentValues values = new ContentValues(); 
    values.put(COLUMN_ID, myTask.getId()); 
    values.put(COLUMN_TASKNAME, myTask.getTitle()); 
    values.put(COLUMN_DAYSLEFT, myTask.getDaysRemaining()); 
    SQLiteDatabase db = getWritableDatabase(); 
    db.insert(TABLE_TASKS, null, values); 
    db.close(); 
} 


//Delete row from the database 
public void deleteTask(String taskID) { 

    SQLiteDatabase db = getWritableDatabase(); 
    db.execSQL("DELETE FROM " + TABLE_TASKS + " WHERE " + COLUMN_ID + "=\"" + taskID + "\";"); 
} 


//To put data into an arraylist 
public List<MyTasksGS> getDataFromDB() 
{ 
    int id, daysRemaining; 
    String title; 

    List<MyTasksGS> tasksList = new ArrayList<MyTasksGS>(); 
    String query = "SELECT * FROM " + TABLE_TASKS; 

    SQLiteDatabase db = getReadableDatabase(); 
    Cursor cursor = db.rawQuery(query, null); 

    cursor.moveToFirst(); 
    while (cursor.moveToNext()) 
    { 
     id = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_ID)); 
     title = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_TASKNAME)); 
     daysRemaining = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_DAYSLEFT)); 
     MyTasksGS myTask = new MyTasksGS(id, title, daysRemaining); 
     tasksList.add(myTask); 
    } 

    return tasksList; 
} 

}

私はaboから返されたarraylistデータをコピーしようとしていますここmyTaskListに(getDataFromDB機能を使用して)クラスましIMは、このエラーを取得:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.example.prateek.karma.TasksDBHandler.getDataFromDB()' on a null object reference

public class MyTasksFragment extends Fragment { 

Button taskComplete; 
RecyclerView RVMyTasks; 
static MyTasksAdapter mtAdapter; 
List<MyTasksGS> myTaskList = new ArrayList<>(); 
TasksDBHandler dbHandler; 


public MyTasksFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_my_tasks, container, false); 

    taskComplete = (Button) view.findViewById(R.id.taskComplete); 

    RVMyTasks = (RecyclerView) view.findViewById(R.id.RVMyTasks); 
    mtAdapter = new MyTasksAdapter(myTaskList); 
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext()); 
    RVMyTasks.setLayoutManager(mLayoutManager); 
    RVMyTasks.setItemAnimator(new DefaultItemAnimator()); 
    RVMyTasks.setAdapter(mtAdapter); 

    myTaskList = dbHandler.getDataFromDB(); 
    mtAdapter.notifyDataSetChanged(); 

    return view; 
} 

}

そして、これがMyTasksGSクラスです:

public class MyTasksGS { 
String title; 
int daysRemaining; 
int id; 

public MyTasksGS() { 

} 

public MyTasksGS(int id, String title, int daysRemaining) { 
    this.title = title; 
    this.daysRemaining = daysRemaining; 
    this.id = id; 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public int getDaysRemaining() { 
    return daysRemaining; 
} 

public void setDaysRemaining(int daysRemaining) { 
    this.daysRemaining = daysRemaining; 
} 

}

私はどこかで非常にばかげたミスをしたかもしれないが、それを見つけることはできない。任意のヘルプが評価されます

答えて

3

dbHandlerをインスタンス化する必要があります。有効なインスタンスなしで使用しようとしています。 NullPointerExceptionが発生します。あなたのonCreateView 上

myTaskList = dbHandler.getDataFromDB();前に、追加で

dbHandler = new TasksDBHandler(getActivity());

はコンストラクタでクラスのプロパティDATABASE_NAMEとDATABASE_VERSION代わりのパスを使用します。

この

public TasksDBHandler(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 
+0

のようなあなたのTaskDBHandlerのコンストラクタを変更するには、私を助けてくれてありがとう!また、私はファーストクラスでこれを使用しますか? TasksDBHandler dbHandler =新しいTasksDBHandler(getApplicationContext()); –

+0

問題なし!どういたしまして! –

+0

TasksDBHandler dbHandler =新しいTasksDBHandler(KarmaDescription.this); あなたは単にアプリケーションコンテキストを渡す代わりにアクティビティコンテキストを追加することができます –

関連する問題