2016-04-01 25 views
1

Ich bin sehr neu bei Android-Programmierung und das ist meine erste Frage auf Stack-Overflow überhaupt. Ich habe Probleme zu verstehen, wo ich in meiner Code-Implementierung falsch gelaufen bin. Ich versuche, Daten in einer Datenbank zu speichern und sie dann in eine Arraylist zu extrahieren.Wie bekomme ich Daten von Android-Datenbank in eine Arraylist

Dies ist die Klasse, wo ich Daten in die Datenbank in der Schaltfläche OnClickListener hinzufügen:

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); 
} 

}

Dies ist die Klasse, die die Datenbank verwaltet:

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; 
} 

}

Ich versuche, die Arraylist Daten zu kopieren, die von der ABO zurückgegeben wird ve Klasse in myTaskList hier und im immer diesen Fehler (getDataFromDB Funktion):

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; 
} 

}

Und das ist die MyTasksGS Klasse:

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; 
} 

}

Ich habe vielleicht irgendwo einen sehr dummen Fehler gemacht, aber ich kann ihn nicht finden. Jede Hilfe wird geschätzt

Antwort

3

Sie müssen den dbHandler instanziieren, Sie versuchen, es ohne eine gültige Instanz zu verwenden. Es verursacht die NullPointerException.

In Ihrem auf onCreateView vor myTaskList = dbHandler.getDataFromDB();

add: statt Pass in Konstruktor dbHandler = new TasksDBHandler(getActivity());

Klasse Eigenschaft DATABASE_NAME und Database_Version verwenden.

Ihre ändern TaskDBHandler Konstruktor wie diese

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

danke mich für die Unterstützung aus! benutze ich das auch in der ersten klasse? TasksDBHandler dbHandler = neuer TasksDBHandler (getApplicationContext()); –

+0

kein Problem, Bruder! Bitte schön! –

+0

TasksDBHandler dbHandler = neuer TasksDBHandler (KarmaDescription.this); Sie können einfach den Kontext der Aktivität anstelle von Pass-Anwendungskontext hinzufügen –

Verwandte Themen