【问题标题】:How to Retrieve Multiple data when clicked on listview?单击列表视图时如何检索多个数据?
【发布时间】:2018-03-26 17:53:07
【问题描述】:

当我单击列表项时,我希望在 SQL 中保存的所有编辑文本内容都显示在编辑账单活动中,但我只能检索名称并在意图中再次显示它。如果我在 editbills_activity 中再次保存现有记录,它应该使用新数据更新记录,而不是保存另一个数据。 这是我的 DBAdapter.java

package com.example.dhruv.bills;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; 
public class DBAdapter {
public static final String KEY_ROWID = "id";
public static final String KEY_NAME = "name";
public static final String KEY_AMOUNT = "amount";
public static final String KEY_DUEDATE = "duedate";
private static final String TAG = "DBAdapter";

private static final String DATABASE_NAME = "billsdb";
private static final String DATABASE_TABLE = "bills";
private static final int DATABASE_VERSION = 2;

private static final String DATABASE_CREATE =
        "create table if not exists assignments (id integer primary key autoincrement, "
                + "name VARCHAR not null, amount VARCHAR, duedate date );";

// Replaces DATABASE_CREATE using the one source definition
private static final String TABLE_CREATE =
        "CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE + "(" +
                KEY_ROWID + " INTEGER PRIMARY KEY, " + // AUTOINCREMENT NOT REQD
                KEY_NAME + " DATE NOT NULL, " +
                KEY_AMOUNT + " VARCHAR ," +
                KEY_DUEDATE + " DATE " +
                ")";

private final Context context;

private DatabaseHelper DBHelper;
private SQLiteDatabase db;

public DBAdapter(Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper
{
    DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        db.execSQL(TABLE_CREATE); // NO need to encapsulate in try clause
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS contacts"); //????????
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }
}

//---opens the database---
public DBAdapter open() throws SQLException
{
    db = DBHelper.getWritableDatabase();
    return this;
}

//---closes the database---
public void close()
{
    DBHelper.close();
}

//---insert a record into the database---
public long insertRecord(String name, String amount, String duedate)
{
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_NAME, name);
    initialValues.put(KEY_AMOUNT, amount);
    initialValues.put(KEY_DUEDATE, duedate);
    //return db.insert(DATABASE_TABLE, null, initialValues);
    // Will return NULL POINTER EXCEPTION as db isn't set
    // Replaces commented out line
    return DBHelper.getWritableDatabase().insert(DATABASE_TABLE,
            null,
            initialValues
    );
}

//---deletes a particular record---
public boolean deleteContact(long rowId)
{
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}

//---retrieves all the records--- SEE FOLLOWING METHOD
public Cursor getAllRecords()
{SQLiteDatabase db = DBHelper.getWritableDatabase();
    String query ="SELECT * FROM " + DATABASE_TABLE;
    Cursor data = db.rawQuery(query,null);
    return data;
}


//As per getAllRecords but using query convenience method
public Cursor getAllAsCursor() {
    return DBHelper.getWritableDatabase().query(
            DATABASE_TABLE,
            null,null,null,null,null,null
    );
}
public Cursor getItemID(String name) {
    SQLiteDatabase db = DBHelper.getWritableDatabase();
    String query = "SELECT " + KEY_ROWID + " FROM " + DATABASE_TABLE +
            " WHERE " + KEY_NAME + " = '" + name + "'";
    Cursor data = db.rawQuery(query, null);
    return data;
}
//---retrieves a particular record--- THIS WILL NOT WORK - NO SUCH TABLE


/* public Cursor getRecord()
{String query1 ="SELECT * FROM" + KEY_TITLE;
    Cursor mCursor = db.rawQuery(query1,null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}*/

// Retrieve a row (single) according to id
public Cursor getRecordById(long id) {
    return DBHelper.getWritableDatabase().query(
            DATABASE_TABLE,
            null,
            KEY_ROWID + "=?",
            new String[]{String.valueOf(id)},
            null,null,null
    );
}


//---updates a record---


/* public boolean updateRecord(long rowId, String name, String amount, String duedate)
{
    ContentValues args = new ContentValues();
    args.put(KEY_NAME, name);
    args.put(KEY_AMOUNT, amount);
    args.put(KEY_DUEDATE, duedate);
    String whereclause = KEY_ROWID + "=?";
    String[] whereargs = new String[]{String.valueOf(rowId)};
    // Will return NULL POINTER EXCEPTION as db isn't set
    //return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
    // Replaces commented out line
    return DBHelper.getWritableDatabase().update(DATABASE_TABLE,
            args,
            whereclause,
            whereargs
    ) > 0;
}*/
}

这是我的 Bills.java (主活动)

问题: Bills.java 有一个列表视图,每当单击列表视图中的项目时,它都会显示意图,但它没有输入金额和日期或更新记录。相反,它会保存另一条记录。

解决方案:我想检索它并显示所有(名称、金额、到期日期),而不是保存另一条记录,它应该更新它。

package com.example.dhruv.bills;

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.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;

public class bills extends AppCompatActivity {
DBAdapter dbAdapter;
ListView mrecycleview;
private static final String TAG ="assignments";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_bills);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    mrecycleview =(ListView) findViewById(R.id.mRecycleView);
    dbAdapter = new DBAdapter(this);
    // mlistview();
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent(getApplicationContext(),Editbills.class);
            startActivity(i);
        }
    });
    mlistview();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_bills, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}


 private void mlistview(){
    Log.d(TAG,"mlistview:Display data in listview");
    Cursor mCursor = dbAdapter.getAllRecords();
    ArrayList<String> listData = new ArrayList<>();
    while (mCursor.moveToNext()){
        listData.add(mCursor.getString(1));
    }
    ListAdapter adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,listData);
    mrecycleview.setAdapter(adapter);
  mrecycleview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
          String name = adapterView.getItemAtPosition(i).toString();
          Log.d(TAG, "onItemClick: You Clicked on " + name);
          Cursor data = dbAdapter.getItemID(name); //get the id associated with that name
          int itemID = -1;
          while(data.moveToNext()){
              itemID = data.getInt(0);
          }
          if(itemID > -1){
              Log.d(TAG, "onItemClick: The ID is: " + itemID);
              Intent editScreenIntent = new Intent(bills.this, Editbills.class);
              editScreenIntent.putExtra("id",itemID);
              editScreenIntent.putExtra("name",name);
              startActivity(editScreenIntent);

          }
          else{

          }
      }
  });


}
}

这是我的 editbills.java 代码

package com.example.dhruv.bills;

import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;


import java.util.ArrayList;

public class Editbills extends AppCompatActivity {
Button button;
private static final String Tag= "assignments";
DBAdapter db = new DBAdapter(this);
private String selectedName;
private int selectedID;
DBAdapter dbAdapter;
private EditText editText,editText2,editText3;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_editbills);
    button=(Button)findViewById(R.id.button);
    editText =(EditText)findViewById(R.id.editText);
    editText2=(EditText)findViewById(R.id.editText2);
    editText3 =(EditText)findViewById(R.id.editText3);
    //get the intent extra from the ListDataActivity
    Intent receivedIntent = getIntent();

    //now get the itemID we passed as an extra
    selectedID = receivedIntent.getIntExtra("id",-1); //NOTE: -1 is just the default value

    //now get the name we passed as an extra
    selectedName = receivedIntent.getStringExtra("name");

    //set the text to show the current selected name
    editText.setText(selectedName);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d("test", "adding");
            db.open();
            long id = db.insertRecord(editText.getText().toString(), editText2.getText().toString(), editText3.getText().toString());
            db.close();
            Toast.makeText(Editbills.this," Added", Toast.LENGTH_LONG).show();
            Intent q = new Intent(getApplicationContext(),bills.class);
            startActivity(q);

        }
    });


}

}

【问题讨论】:

  • editbills.java 中你想更新从intent 接收到的id 的行吗?
  • @NiamatullahBakhshi 我想更新我在单击列表视图时添加的列,该列表视图使用行 ID 将文本设置为之前保存的编辑文本
  • 那么,你想更新在listView上被点击的项目吗?
  • 在您的编辑账单活动中,您为什么不调用updateRecord 方法?您正在调用 insertRecord 方法
  • 而不是提供更新列的解决方案,我希望您在我单击 Listview 中的项目时帮助我检索列的所有值或编辑文本。我只能检索 1 个字符串,该字符串是我在 bill.java @NiamatullahBakhshi 中添加了代码的名称

标签: java android sql listview android-arrayadapter


【解决方案1】:

有两个部分/问题。

首先要检索数据,以便它可以显示在 editbills 活动中,您可以结合getRecordById 方法使用传递给活动的行的id。 p>

我建议向 editbills 类添加一个方法会很简单。

    private void populateDisplay(int id) {

        Cursor csr = dbAdapter.getRecordById(id);
        if (csr.moveToFirst()) {
            editText.setText(csr.getString(csr.getColumnIndex(DBAdapter.KEY_NAME)));
            editText2.setText(csr.getString(csr.getColumnIndex(DBAdapter.KEY_AMOUNT)));
            editText3.setText(csr.getString(csr.getColumnIndex(DBAdapter.KEY_DUEDATE)));
        }
        csr.close();
    }

您可以在从 Intent 中检索 id 后调用上述方法:-

    populateDisplay(selectedID);

要根据 EditTexts 的内容进行更新,取消注释 DBAdapter.java 中的 updateRecord 方法和更改:-

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Log.d("test", "adding");
        db.open();
        long id = db.insertRecord(editText.getText().toString(), editText2.getText().toString(), editText3.getText().toString());
        db.close();
        Toast.makeText(Editbills.this," Added", Toast.LENGTH_LONG).show();
        Intent q = new Intent(getApplicationContext(),bills.class);
        startActivity(q);

    }
});

到:-

    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (dbAdapter.updateRecord(
                    selectedId,
                    editText.getText().toString(),
                    editText2.getText().toString(),
                    editText3.getText().toString())
                    ) {
                Log.d("TEST","Row successfully updated.");
                Toast.makeText(getApplicationContext(),"Row Updated.",Toast.LENGTH_LONG).show();
                populateDisplay(selectedId);
            } else {
                Toast.makeText(getApplicationContext(),"Row not Updated",Toast.LENGTH_LONG).show();
            }
            Intent q = new Intent(getApplicationContext(),bills.class);
            startActivity(q);
        }
    });

您还必须添加一行初始化dbAdapterdbAdapter = new DBAdapter(this); i.d 建议在setContentView(R.layout.activity_editbills); 行之后立即添加此行

  • 注意上面的代码是在原理上,并且没有经过彻底的测试,所以它可能包含错误。

编辑完整的工作示例:-

以下代码基本上是上述代码的实现,除了修改为使用 Bill 类。而不是 ArrayList&lt;String&gt; 作为适配器的源,它有 ArrayList&lt;Bill&gt;

因此所有数据(id、姓名、金额和到期日)都可用。

您应该注意到,我重写了 toString 方法以返回一个包含 nameamountduedate 的字符串。 ArrayAdapter 使用对象的toString 方法来填充视图。

说关键值是 rowidrowid 的别名,因为即使其他数据相同,也可以使用它来标识行(由于addSomeData 方法,多次运行此示例时会发生这种情况)。因此,只有 id 会在列表中的项目被长按时被提取并传递给 Editbills 活动(从刚刚单击更改以减少意外使用的可能性)

Bill.java

public class Bill {

    private long id;
    private String name;
    private String amount;
    private String duedate;

    public Bill(long id, String name, String amount, String duedate) {
        this.id = id;
        this.name = name;
        this.amount = amount;
        this.duedate = duedate;
    }
    /*
            Note if this Constructor used then setId should be used
     */
    public Bill(String name, String amount, String duedate) {
        new Bill(0,name,amount,duedate);
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAmount() {
        return amount;
    }

    public void setAmount(String amount) {
        this.amount = amount;
    }

    public String getDuedate() {
        return duedate;
    }

    public void setDuedate(String duedate) {
        this.duedate = duedate;
    }

    /*
            As ArrayAdapter uses toString method change this
            to return all items
     */
    @Override
    public String toString() {
        return name + " " + amount + " " + duedate;
    }
}

MainActivity.java

这相当于你的 Bills.java 没有很多像 FAB 这样的臃肿。 :-

public class MainActivity extends AppCompatActivity {

    public static final String ID_INTENTEXTRA = DBAdapter.KEY_ROWID + "_INTENTEXTRA"; //<<<< ADDED

    DBAdapter mDBAdapter;
    Cursor mCsr;
    ListView mrecycleview;
    ArrayAdapter adapter; //<<<< NOT ListAdapter
    Context context; // ADDED
    private static final String TAG ="assignments";

    ArrayList<Bill> mBillList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        mrecycleview = this.findViewById(R.id.mRecycleView);

        mDBAdapter = new DBAdapter(this);
        addSomeData();

        adapter = new ArrayAdapter<Bill>(
                this,
                android.R.layout.simple_list_item_1,
                mBillList
        );
        mrecycleview.setAdapter(adapter);
        mrecycleview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Bill b = (Bill) adapter.getItem(position);
                Intent i = new Intent(context,Editbills.class);
                i.putExtra(ID_INTENTEXTRA,b.getId()); //Get ID
                startActivity(i);
                return true;
            }
        });
        rebuildBillList();
    }

    //<<<< ADDED Method to refresh the ListView resumed
    @Override
    protected void onResume() {
        super.onResume();
        rebuildBillList();
    }

    // Add some data (note will add 2 rows each time it is run)
    private void addSomeData() {
        mDBAdapter.insertRecord("Bill1","2018-10-02","English");
        mDBAdapter.insertRecord("Bill2","2018-09-03","Mathematics");
        mDBAdapter.insertRecord("Bill3","2018-11-04", "Geography");
    }

    public void rebuildBillList() {
        mBillList.clear();
        mCsr = mDBAdapter.getAllAsCursor();
        while (mCsr.moveToNext()) {
            mBillList.add(new Bill(
                            mCsr.getLong(mCsr.getColumnIndex(DBAdapter.KEY_ROWID)),
                            mCsr.getString(mCsr.getColumnIndex(DBAdapter.KEY_NAME)),
                            mCsr.getString(mCsr.getColumnIndex(DBAdapter.KEY_AMOUNT)),
                            mCsr.getString(mCsr.getColumnIndex(DBAdapter.KEY_DUEDATE))
                    )
            );
        }
        adapter.notifyDataSetChanged();
    }
}
  • 注意上面每次运行都会增加3行。

Editbills.java

public class Editbills extends AppCompatActivity {
    Button button;
    private static final String Tag = "assignments";
    DBAdapter db = new DBAdapter(this);
    private String selectedName;
    private long selectedID;
    DBAdapter dbAdapter;
    private EditText editText,editText2,editText3;
    Context context;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_editbills);
        context = this;
        dbAdapter = new DBAdapter(this); //<<<< ADDED
        button=(Button)findViewById(R.id.button);
        editText =(EditText)findViewById(R.id.edittext);
        editText2=(EditText)findViewById(R.id.edittext2);
        editText3 =(EditText)findViewById(R.id.edittext3);
        //get the intent extra from the ListDataActivity
        Intent receivedIntent = getIntent();

        //now get the itemID we passed as an extra
        selectedID = receivedIntent.getLongExtra(MainActivity.ID_INTENTEXTRA,-1L); //NOTE: -1 is just the default value
        populateDisplay(selectedID);

        //now get the name we passed as an extra
        //selectedName = receivedIntent.getStringExtra("name");

        //set the text to show the current selected name
        //editText.setText(selectedName); <<<< commented out
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                /*
                Log.d("test", "adding");
                db.open();
                long id = db.insertRecord(editText.getText().toString(), editText2.getText().toString(), editText3.getText().toString());
                db.close();
                Toast.makeText(Editbills.this," Added", Toast.LENGTH_LONG).show();
                */
                /*
                * <<<< Not the way as it ends/closes the existing activity
                Intent q = new Intent(getApplicationContext(),MainActivity.class);
                startActivity(q);
                */
                String toast = "Updated.";
                if (dbAdapter.updateRecord(selectedID,
                        editText.getText().toString(),
                        editText2.getText().toString(),
                        editText3.getText().toString())) {
                } else {
                    toast = "Not Updated.";
                }
                Toast.makeText(context,toast,Toast.LENGTH_LONG).show();
                finish(); //<<<< ends/closes this activity and returns to calling activity
            }
        });
    }

    private void populateDisplay(long id) {
        Cursor csr = dbAdapter.getRecordById(id);
        if (csr.moveToFirst()) {
            editText.setText(csr.getString(csr.getColumnIndex(DBAdapter.KEY_NAME)));
            editText2.setText(csr.getString(csr.getColumnIndex(DBAdapter.KEY_AMOUNT)));
            editText3.setText(csr.getString(csr.getColumnIndex(DBAdapter.KEY_DUEDATE)));
        }
        csr.close();
    }
}
  • 基本上按照原始答案。

DBAdapter.java

public class DBAdapter {
    public static final String KEY_ROWID = "id";
    public static final String KEY_NAME = "name";
    public static final String KEY_AMOUNT = "amount";
    public static final String KEY_DUEDATE = "duedate";
    private static final String TAG = "DBAdapter";

    private static final String DATABASE_NAME = "billsdb";
    private static final String DATABASE_TABLE = "bills";
    private static final int DATABASE_VERSION = 2;


    // Replaces DATABASE_CREATE using the one source definition
    private static final String TABLE_CREATE =
            "CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE + "(" +
                    KEY_ROWID + " INTEGER PRIMARY KEY, " + // AUTOINCREMENT NOT REQD
                    KEY_NAME + " DATE NOT NULL, " +
                    KEY_AMOUNT + " VARCHAR ," +
                    KEY_DUEDATE + " DATE " +
                    ")";

    private Context context;

    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public DBAdapter(Context ctx)
    {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }

    private static class DatabaseHelper extends SQLiteOpenHelper
    {
        DatabaseHelper(Context context)
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            db.execSQL(TABLE_CREATE); // NO need to encapsulate in try clause
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS contacts"); //????????
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
            onCreate(db);
        }
    }

    //---opens the database--- NOT NEEDED
    public DBAdapter open() throws SQLException
    {
        db = DBHelper.getWritableDatabase();
        return this;
    }

    //---closes the database--- NOT NEEDED
    public void close()
    {
        DBHelper.close();
    }

    //---insert a record into the database---
    public long insertRecord(String name, String amount, String duedate)
    {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_NAME, name);
        initialValues.put(KEY_AMOUNT, amount);
        initialValues.put(KEY_DUEDATE, duedate);
        return DBHelper.getWritableDatabase().insert(DATABASE_TABLE,
                null,
                initialValues
        );
    }

    //---deletes a particular record---
    public boolean deleteContact(long rowId)
    {
        return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
    }

    //---retrieves all the records--- SEE FOLLOWING METHOD
    public Cursor getAllRecords()
    {SQLiteDatabase db = DBHelper.getWritableDatabase();
        String query ="SELECT * FROM " + DATABASE_TABLE;
        Cursor data = db.rawQuery(query,null);
        return data;
    }


    //As per getAllRecords but using query convenience method
    public Cursor getAllAsCursor() {
        return DBHelper.getWritableDatabase().query(
                DATABASE_TABLE,
                null,null,null,null,null,null
        );
    }
    public Cursor getItemID(String name) {
        SQLiteDatabase db = DBHelper.getWritableDatabase();
        String query = "SELECT " + KEY_ROWID + " FROM " + DATABASE_TABLE +
                " WHERE " + KEY_NAME + " = '" + name + "'";
        Cursor data = db.rawQuery(query, null);
        return data;
    }

    // Retrieve a row (single) according to id
    public Cursor getRecordById(long id) {
        return DBHelper.getWritableDatabase().query(
                DATABASE_TABLE,
                null,
                KEY_ROWID + "=?",
                new String[]{String.valueOf(id)},
                null,null,null
        );
    }

    //---updates a record---
    public boolean updateRecord(long rowId, String name, String amount, String duedate) {
        ContentValues args = new ContentValues();
        args.put(KEY_NAME, name);
        args.put(KEY_AMOUNT, amount);
        args.put(KEY_DUEDATE, duedate);
        String whereclause = KEY_ROWID + "=?";
        String[] whereargs = new String[]{String.valueOf(rowId)};
        return DBHelper.getWritableDatabase().update(DATABASE_TABLE,
            args,
            whereclause,
            whereargs
        ) > 0;
    }
}
  • upDateRecord 已取消注释外,基本上与原来的答案相同。

结果

第一次运行 - MainActivity(账单):-

Long Click Bill2(注意从 Click 更改为 Long Click 不太容易意外使用)

更改数据(未点击更新按钮)

点击更新按钮(Toast 已更新。)

  • 注意使用finish()返回调用activity,然后使用onResume根据更新的数据刷新列表(可能是你的下一个问题)时间>。
    • 使用startActivity 只会导致问题。
  • 注意 值是日期和课程,而不是金额和到期日期,因为我没有更改 addSomeData 方法中的值(很容易做到)。
    • 实际数据本身与流程无关。

【讨论】:

  • Brother 它不起作用,因为请参阅 bills.java,我已经添加了检索名称但不检索其他名称的方法。字段和您建议的更新记录显示“行未更新”
  • 能否请您邮寄您所做的项目并再次感谢您的帮助。我将对我现有的项目进行修改。请做这将是一个很大的帮助。要我提供您的电子邮件 ID 吗?
  • 上面的代码,除了布局之外,就是你所需要的。布局非常基本。对于 Main Activity,您只需要一个 ID 为 mRecycleView 的 Listview。对于 Editbills,布局是 3 个 ID 为 edittextedittext2edittext3 的 Edittext,以及一个 ID 为 button的 Button >。所有 id 都是根据您的代码中的名称命名的,因此您拥有的现有布局可能很合适。事实上,整个代码都是基于您的代码。
  • 是的,应用了您建议的代码。当您编辑评论时,我在 30 分钟内应用了它,但每当我退出活动时它会自动添加 3 项,这就是我要求您发送邮件的原因。无论如何,这是一个很大的帮助。 ☺️
  • 你所要做的就是删除addSomeData();这一行,然后它会变得多余,删除addSomeData方法。
猜你喜欢
  • 2015-11-17
  • 2020-08-18
  • 2016-02-13
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
相关资源
最近更新 更多