【问题标题】:Values in ListView are reset once I close and reopen Android app一旦我关闭并重新打开 Android 应用程序,ListView 中的值就会被重置
【发布时间】:2016-07-25 23:48:05
【问题描述】:

在我的 MainActivity 中,出现了一个对话框,用户在两个 EditTexts 中输入了他们的信息。第一个 EditText 是他们的名字,第二个是这个人的欠款。然后将这些数据保存到数据库中,并显示在我的 listView 中。当我关闭应用程序并重新打开它时,我从数据库中获取值,但由于某种原因,每个视图的编号从 1 到我输入数据的次数,并且数字数据全部设置为 0。任何帮助都会很大赞赏。这是我的代码。

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;
}



 }

【问题讨论】:

    标签: android database listview


    【解决方案1】:

    您已将数据库中的 amount 列定义为 TEXT,但您将其值作为整数获取,这给了您 '0' 。

    你必须修改你的获取查询如下 -

     owes.setAmountExtra(cursor.getString(1));
    

    【讨论】:

    • 在我的 OweInfo 类中,我将金额设置为 int,因此 cursor.getString(1) 对我不起作用。你建议我做什么?
    • 在这种情况下,您可以更改数据库结构,将amount列为整数。
    • 我将金额列设为整数。我卸载了该应用程序并重新安装它,我遇到了同样的问题。
    • 请提取并验证您的数据库是否包含正确的值。
    • 感谢您的帮助。我很感激。
    【解决方案2】:

    我发现了这个问题。在我的数据库类中,我更改了行

    String selectQuery = " SELECT * FROM " + TABLE_NAME; 
    
                            To
    
    String[] tableColumns = new String[]{"name", "amount"}; 
    

    然后我运行了一个查询

    Cursor cursor = db.query("owes", tableColumns, null, null, null, null, null);
    

    以前,我选择了所有列,包括 _id 列,当您向表中添加数据时,该列会自动更新。这就是为什么我的所有视图都被编号而另一个视图是 0。我正在查询所有列并且因为我有两个 TextView,所以我在第一个 TextView 中显示 id,在第二个 TextView 中显示人名,这就是为什么值是 0。所以最好指定要查询的确切列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多