繁体   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