2017-01-27 1 views
0

У меня возникают проблемы с моей базой данных, и я не могу отследить проблему. Я Android noob.
Всякий раз, когда я добавляю термин или удаляю термин, данные, похоже, загружаются за неправильный элемент списка, на который я нажимаю.
Мне пришлось изменить идентификатор, прежде чем отправлять его, чтобы попытаться исправить его, но я продолжаю получать ошибки.База данных SQLite и ListView не синхронизируются должным образом, отключены на 1 номер

Вот мой DataSource код:

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

ли вы на самом деле думаете, что позиция ListView элемент подключен непосредственно к ряду Я бы? –

+0

Hrmm Я предполагаю, что так предположил –

+0

Это распространенная ошибка. –

ответ

1

в TermActivity, вам необходимо получить идентификатор по позиции пункта в адаптер, а не 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); 
} 
+0

Большое вам спасибо за информацию об этой проблеме, которую вы так долго спасли. Одна вещь, однако, я, похоже, не могу использовать метод .get (position). –

+0

Вы можете попробовать использовать 'getItem (position)'. –

+0

hahaha Я сделал это, а затем .getId() перестает работать! Я вообще не понимаю андроид. –

Смежные вопросы