在我的MainActivity中,我有一個對話框出現,用戶在兩個EditText中輸入他們的信息。第一個EditText是他們的名字,第二個是他欠的金額。這些數據然後被保存到數據庫並顯示在我的listView中。當我關閉應用程序並重新打開它時,我從數據庫中獲取值,但由於某種原因,每個視圖的編號從1到輸入數據的次數,數值數據都設置爲0。讚賞。這是我的代碼。當我關閉並重新打開Android應用時,ListView中的值會重置
public class MainActivity extends AppCompatActivity
{
FloatingActionButton fab;
private ListView listView;
private ArrayAdapter<OweInfo> adapter;
private PayUpDatabaseHelper db = new PayUpDatabaseHelper(this);
Context context;
ArrayList<OweInfo> owesList;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this.getApplicationContext();
owesList = db.getAllOwes();
adapter = new OwesAdapter(this, R.layout.payup_list_row, owesList);
listView = (ListView)findViewById(R.id.list);
if(adapter != null && listView != null)
{
listView.setAdapter(adapter);
}
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
fab = (FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//fire up the dialog!
startDialog();
}
});
}
public void startDialog()
{
//Instantiate an AlertDialog.Builder with its constructor
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
//get layout inflater
LayoutInflater inflater = getLayoutInflater();
//inflate and set the layout for the dialog
// pass null as the parent view because its going in the dialog layout
final View view = inflater.inflate(R.layout.fragment_owe_dialog,null);
builder.setView(view)
//add action buttons
.setPositiveButton(R.string.positive_button, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int id)
{
EditText nameEditText = (EditText)view.findViewById(R.id.name_edit_text);
EditText amountEditText = (EditText)view.findViewById(R.id.amount_edit_text);
String getNameText = nameEditText.getText().toString();
int getAmountText = Integer.parseInt(amountEditText.getText().toString());
OweInfo owes = new OweInfo(getNameText, getAmountText);
db.addOwe(owes);
adapter.add(owes);
adapter.notifyDataSetChanged();
}
})
.setNegativeButton(R.string.negative_button, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int id)
{
dialog.dismiss();
}
});
builder.create().show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
return super.onOptionsItemSelected(item);
}
}
下面是我的數據庫
public class PayUpDatabaseHelper extends SQLiteOpenHelper
{
public SQLiteDatabase db;
//Database name
public static final String DB_NAME = "com.ch1bi.payup";
//Database version
public static final int DB_VERSION = 1;
//PayUp table name
public static final String TABLE_NAME = "owes";
//PayUp table column names
public static final String KEY_ID = "_id";
public static final String KEY_NAME = "name";
public static final String KEY_AMOUNT = "amount";
public PayUpDatabaseHelper(Context context)
{
super(context, DB_NAME, null, DB_VERSION);
}
//Create table
@Override
public void onCreate(SQLiteDatabase db)
{
String createTable = "CREATE TABLE " + TABLE_NAME + "("
+ KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_NAME + " TEXT NOT NULL,"
+ KEY_AMOUNT + " TEXT NOT NULL)";
db.execSQL(createTable);
}
//code for upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
public void addOwe(OweInfo info)
{
//open database to write to it
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, info.getNameExtra());
values.put(KEY_AMOUNT, info.getAmountExtra());
//insert values into row
db.insert(TABLE_NAME, null, values);
//close connection after writing to db
db.close();
}
public ArrayList<OweInfo> getAllOwes()
{
ArrayList<OweInfo> oweList = new ArrayList<>();
String selectQuery = " SELECT * FROM " + TABLE_NAME;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
//looping through all rows and adding to list
if(cursor.moveToFirst())
{
do
{
OweInfo owes = new OweInfo();
owes.setNameExtra(cursor.getString(0));
owes.setAmountExtra(cursor.getInt(1));
oweList.add(owes);
}
while (cursor.moveToNext());
}
cursor.close();
return oweList;
}
}
我的自定義類
public class OweInfo
{
private String nameExtra;
private int amountExtra;
public OweInfo()
{
}
public OweInfo(String name, int amount)
{
this.nameExtra = name;
this.amountExtra = amount;
}
public String getNameExtra()
{
return this.nameExtra;
}
public void setNameExtra(String nameExtra)
{
this.nameExtra = nameExtra;
}
public int getAmountExtra()
{
return this.amountExtra;
}
public void setAmountExtra(int amountExtra)
{
this.amountExtra = amountExtra;
}
}
在我的OweInfo類中,我設置了一個int值,所以cursor.getString(1)不適用於我。你會建議我做什麼? – Ch1bz
在這種情況下,您可以更改數據庫結構,將「amount」列設置爲整數。 –
我將金額欄設爲整數。我卸載了應用程序並重新安裝了它,而且我遇到了同樣的問題。 – Ch1bz