SQLite数据库和ListView没有正确同步,关闭1个数字

时间:2017-01-27 22:53:15

标签: android sqlite android-sqlite

我的数据库出现问题,似乎无法追查问题。我是一个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中的一个方法是错误的,或者我在两个活动之间的某处使用了错误的代码。

1 个答案:

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