我的数据库出现问题,似乎无法追查问题。我是一个Android菜鸟 每当我添加一个术语或删除一个术语时,数据似乎都是为我点击的错误列表视图项加载的 我必须在将id发送到意图尝试修复之前修改id,但我一直都会遇到错误。
这是我的数据源代码:
package com.mikero.termtracker;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import java.util.ArrayList;
import java.util.List;
public class DataSource {
//Fields
private SQLiteDatabase db;
private DBOpenHelper helper;
private String[] allTermColums = {DBOpenHelper.KEY_ID, DBOpenHelper.NAME_OF_TERM,
DBOpenHelper.TERM_START_DATE, DBOpenHelper.TERM_END_DATE};
public DataSource(Context context){
helper = new DBOpenHelper(context);
}
public void open() throws SQLiteException{
db = helper.getWritableDatabase();
}
public void close(){
helper.close();
}
//Create Term
public Term createTerm(Term term){
ContentValues cv = new ContentValues();
cv.put(DBOpenHelper.NAME_OF_TERM, term.getTermsName());
cv.put(DBOpenHelper.TERM_START_DATE, term.getTermStartDate());
cv.put(DBOpenHelper.TERM_END_DATE, term.getTermEndDate());
long insertId = db.insert(DBOpenHelper.TERMS_TABLE, null, cv);
term.setId(insertId);
return term;
}
//Update term
public void update(Term term){
long id = term.getId();
ContentValues cv = new ContentValues();
cv.put(DBOpenHelper.NAME_OF_TERM, term.getTermsName());
cv.put(DBOpenHelper.TERM_START_DATE, term.getTermStartDate());
cv.put(DBOpenHelper.TERM_END_DATE, term.getTermEndDate());
db.update(DBOpenHelper.TERMS_TABLE, cv, DBOpenHelper.KEY_ID + " = " + id, null);
}
//CursorToTerm method
private Term cursorToTerm(Cursor cursor){
Term term = new Term();
term.setId(cursor.getLong(0));
term.setTermsName(cursor.getString(1));
term.setTermStartDate(cursor.getString(2));
term.setTermEndDate(cursor.getString(3));
return term;
}
//Getting all terms
public List<Term> getAllTerms(){
List<Term> termList = new ArrayList<>();
Cursor cursor = db.query(DBOpenHelper.TERMS_TABLE, allTermColums,
null, null, null, null, null);
cursor.moveToFirst();
while(!cursor.isAfterLast()) {
Term term = cursorToTerm(cursor);
termList.add(term);
cursor.moveToNext();
}
cursor.close();
return termList;
}
//Getting and creating a single term
public Term getSingleTermById(long id){
Cursor cursor = db.query(DBOpenHelper.TERMS_TABLE, allTermColums,
DBOpenHelper.KEY_ID + " = ?",
new String[] {String.valueOf(id)}, null, null, null);
if (cursor != null){
cursor.moveToFirst();
}
Term term = cursorToTerm(cursor);
return term;
}
//Getting a single term by id
// public Cursor getTermById(long id){
// Cursor cursor = db.query(DBOpenHelper.TERMS_TABLE, allTermColums,
// DBOpenHelper.KEY_ID + " = ?",
// new String[] {String.valueOf(id)}, null, null, null);
// return cursor;
// }
//Delete single term
public void deleteTerm(Term term){
long id = term.getId();
db.delete(DBOpenHelper.TERMS_TABLE, DBOpenHelper.KEY_ID + " = " + id, null);
}
//Delete single term by id
public void deleteTermById(long id){
db.delete(DBOpenHelper.TERMS_TABLE, DBOpenHelper.KEY_ID + " = " + id, null);
}
}
这是我的TermViewActivity:
package com.mikero.termtracker;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;
public class TermViewActivity extends AppCompatActivity {
public static final String EXTRA_TERMNO = "termNo";
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
private GoogleApiClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_term_view);
//Get term id from intent
final long termNo = (Long) getIntent().getExtras().get(EXTRA_TERMNO);
//Create a cursor
DBOpenHelper helper = new DBOpenHelper(getApplicationContext());
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query(DBOpenHelper.TERMS_TABLE, new String[]{DBOpenHelper.KEY_ID,
DBOpenHelper.NAME_OF_TERM,
DBOpenHelper.TERM_START_DATE, DBOpenHelper.TERM_END_DATE},
DBOpenHelper.KEY_ID + " = ?",
new String[]{String.valueOf(termNo)}, null, null, null);
if (cursor.moveToFirst()) {
//Get all the info to populate TextViews
String nameOfTerm = cursor.getString(1);
String termStartDate = cursor.getString(2);
String termEndDate = cursor.getString(3);
//Populate first textview
TextView textView1 = (TextView) findViewById(R.id.textview_term_name);
textView1.setText(nameOfTerm);
//Populate second textview
TextView textView2 = (TextView) findViewById(R.id.textview_term_start_date);
textView2.setText(termStartDate);
//Populate third textview
TextView textView3 = (TextView) findViewById(R.id.textview_term_end_date);
textView3.setText(termEndDate);
}
cursor.close();
db.close();
//Set listener
Button deleteButton = (Button) findViewById(R.id.delete_term_button);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(TermViewActivity.this);
alertDialog.setTitle("Delete Confirmation");
alertDialog.setMessage("Are you sure you want delete this?");
alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
DataSource ds = new DataSource(getApplicationContext());
ds.open();
// ds.deleteTermById(termNo);
Term term = ds.getSingleTermById(termNo);
ds.deleteTerm(term);
ds.close();
}
});
// Setting Negative "NO" Button
alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Write your code here to invoke NO event
Toast.makeText(getApplicationContext(), "You clicked on NO", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
alertDialog.show();
}
});
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
public Action getIndexApiAction() {
Thing object = new Thing.Builder()
.setName("TermView Page") // TODO: Define a title for the content shown.
// TODO: Make sure this auto-generated URL is correct.
.setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
.build();
return new Action.Builder(Action.TYPE_VIEW)
.setObject(object)
.setActionStatus(Action.STATUS_TYPE_COMPLETED)
.build();
}
@Override
public void onStart() {
super.onStart();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client.connect();
AppIndex.AppIndexApi.start(client, getIndexApiAction());
}
@Override
public void onStop() {
super.onStop();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
AppIndex.AppIndexApi.end(client, getIndexApiAction());
client.disconnect();
}
}
这是我的TermActivity:
package com.mikero.termtracker;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
public class TermActivity extends ListActivity {
private DataSource ds;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_term);
ds = new DataSource(this);
ds.open();
setAdapter();
}
@Override
public void onRestart(){
super.onRestart();
finish();
startActivity(getIntent());
}
public void onClick(View view){
ArrayAdapter<Term> adapter = (ArrayAdapter<Term>)getListAdapter();
Term term = null;
switch(view.getId()){
case R.id.addButton:
Intent intent = new Intent(getApplicationContext(), TermEditActivity.class);
startActivity(intent);
break;
}
}
@Override
public void onListItemClick(ListView listView,
View itemView,
int position,
long id){
id = id+1L;
Intent intent = new Intent(getApplicationContext(), TermViewActivity.class);
intent.putExtra(TermViewActivity.EXTRA_TERMNO, id);
startActivity(intent);
}
public ArrayAdapter<Term> setAdapter(){
List<Term> termList = ds.getAllTerms();
ArrayAdapter<Term> adapter = new ArrayAdapter<Term>(this,
android.R.layout.simple_list_item_1, termList);
setListAdapter(adapter);
return adapter;
}
}
我只能认为我的DataSource中的一个方法是错误的,或者我在两个活动之间的某处使用了错误的代码。
答案 0 :(得分:1)
在 TermActivity 中,您需要获取适配器中项目的位置的ID,而不是ID:
@Override
public void onListItemClick(ListView listView,
View itemView,
int position,
long id){
Intent intent = new Intent(getApplicationContext(), TermViewActivity.class);
// get the id of object by its position in
// the adapter
Term term = getListView().getItemAtPosition(position);
long itemId = term.getId();
intent.putExtra(TermViewActivity.EXTRA_TERMNO, itemId);
startActivity(intent);
}