簡體   English   中英

如何從android數據庫中獲取數據到arraylist

[英]how to get data from android database into an arraylist

我是android編程的新手,這是我關於堆棧溢出的第一個問題。 我無法理解我的代碼實現中出錯的地方。 我正在嘗試將數據存儲在數據庫中,然后將其提取到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;
}

}

我正在嘗試將上面的類(使用getDataFromDB函數)返回的arraylist數據復制到myTaskList中,並且我得到了這個錯誤:

java.lang.NullPointerException:嘗試在空對象引用上調用虛方法'java.util.List com.example.prateek.karma.TasksDBHandler.getDataFromDB()'

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

}

我可能在某個地方犯了一個非常愚蠢的錯誤,但我無法找到它。 任何幫助表示贊賞

您需要實例化dbHandler,您嘗試在沒有有效實例的情況下使用它。 它會導致NullPointerException。

myTaskList = dbHandler.getDataFromDB();之前的on onCreateView中myTaskList = dbHandler.getDataFromDB();

add: dbHandler = new TasksDBHandler(getActivity());

使用您的類屬性DATABASE_NAME和DATABASE_VERSION而不是傳入構造函數。

像這樣更改你的TaskDBHandler構造函數

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM