2016-07-25 102 views
0

在我的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; 
} 



} 

回答

0

你已經在你的數據庫TEXT定義的amount欄的代碼,但是你取它作爲整數值這就給你'0'。

您必須修改您的獲取查詢如下 -

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

在我的OweInfo類中,我設置了一個int值,所以cursor.getString(1)不適用於我。你會建議我做什麼? – Ch1bz

+0

在這種情況下,您可以更改數據庫結構,將「amount」列設置爲整數。 –

+0

我將金額欄設爲整數。我卸載了應用程序並重新安裝了它,而且我遇到了同樣的問題。 – Ch1bz

0

我想通了這個問題。在我的數據庫類我改了行

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中顯示了該標識,而在第二個中顯示了該人的名稱,這就是爲什麼值爲0.因此,最好指定我想查詢的確切列。

相關問題