使用微调器小部件更新特定列

时间:2014-03-16 21:44:41

标签: java android sqlite sql-update spinner

我正在尝试使用下拉式微调器来更新数据库中唯一行的当前信用列,该微调器从arraylist获取值。非常不确定如何进行此操作。感谢您提前提供的任何帮助。

我的数据库代码:

package com.example.parkangel;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class UDbHelper extends SQLiteOpenHelper
{
    public static final String KEY_ROWID = "_id";
    public static final String KEY_PFNAME = "payeeFname";
    public static final String KEY_PSNAME = "payeeSname";
    public static final String KEY_CARD = "card";
    public static final String KEY_CREDITS = "credits";

    private static final String DATABASE_NAME = "UserData.db";
    private static final String DATABASE_TABLE = "UserTable";
    private static final int DATABASE_VERSION = 1;

    //private UDbHelper dbHelper;
    //private final Context ourContext;
    private static UDbHelper instance;
    private SQLiteDatabase ourDatabase;

    public UDbHelper(Context context) 
    {   
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public static UDbHelper getInstance(Context context)
    {
        if (instance == null)
        {
            instance = new UDbHelper(context);  
        }
        return instance;
    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        // TODO Auto-generated method stub
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_PFNAME + " TEXT NOT NULL, " + KEY_PSNAME + " 
                                    TEXT NOT NULL, " +
                KEY_CARD + " TEXT NOT NULL, " + KEY_CREDITS + " TEXT 
                                    NOT NULL);");   
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {

        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }

    public synchronized UDbHelper open() throws SQLException
    {
        System.out.println ("running open");
        if(ourDatabase == null || !ourDatabase.isOpen())
        ourDatabase = getWritableDatabase();
        return this;
    }   

    public String getData() 
    {
        // TODO Auto-generated method stub
        String[] columns = new String[] {KEY_ROWID, KEY_PFNAME, KEY_PSNAME,
     KEY_CARD, KEY_CREDITS};
        Cursor  c = ourDatabase.query(DATABASE_TABLE, columns, null, null, 
                    null, null, null);
        String result = " ";

        int iRow = c.getColumnIndexOrThrow(KEY_ROWID);
        int iPFname = c.getColumnIndexOrThrow(KEY_PFNAME);
        int iPSname = c.getColumnIndexOrThrow(KEY_PSNAME);
        int iCard = c.getColumnIndexOrThrow(KEY_CARD);
        int iCredits = c.getColumnIndexOrThrow(KEY_CREDITS);

        for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
            result = result + c.getString(iRow) + " " + 
                         c.getString(iPFname) + " " +
        c.getString(iPSname) 
                       + " " + c.getString(iCard) + " " +

                          c.getString(iCredits) + "\n";
        }
        return result;
    }
}

我的主要活动代码我将通过以下方式进行操作:

package com.example.parkangel;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;

public class Balance extends Activity{

Button add;
TextView display;
Spinner spinner3;
String[] money = {"Select amount", "£1", "£2", "£5", "£10"};    

protected void onCreate(Bundle savedInstanceState) {                
    super.onCreate(savedInstanceState);
    setContentView(R.layout.balance_layout);
    TextView tv = (TextView) findViewById(R.id.firstn);
    UDbHelper db = new UDbHelper(this);
    db.open();
    String data = db.getData();
    db.close();
    tv.setText(data);

    ArrayAdapter<String> adapter3 = new ArrayAdapter<String>(Balance.this,  
    android.R.layout.simple_spinner_item, money);

    spinner3 = (Spinner) findViewById (R.id.moneytoadd);
    spinner3.setAdapter(adapter3);

    add = (Button) findViewById(R.id.topup);


}

public void onClick(View arg0)
{


}

public void updateActivity(View view){
    Intent book = new Intent(Balance.this, BookTicket.class);
    startActivity(book);
}

public void addBalance(View view){
    Intent addB = new Intent(Balance.this, Balance.class);
    startActivity(addB);
}

public void doUpdate(View view){
    Intent upd = new Intent(Balance.this, UpdateTicket.class);
    startActivity(upd);
}
}

2 个答案:

答案 0 :(得分:0)

我没有发现问题,但我可以告诉你,你的代码非常不实用。您正在使用StringgetData方法中构建结果。每次尝试将新数据(行)附加到旧数据时,您都要创建一个新的string来保存新数据。如果要从数据库中检索1000行,这意味着您要创建1000 string来构建最后一行。我建议使用StringBuilder代替:

StringBuilder strBuilder= new StringBuilder();
for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
        strBuilder.append( c.getString(iRow) + " " + 
                     c.getString(iPFname) + " " +
    c.getString(iPSname) 
                   + " " + c.getString(iCard) + " " +

                      c.getString(iCredits) + "\n");
    }

   return str= strBuilder.toString(); 

以下是如何插入数据库的示例:

SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues();
values.put(KEY_PFNAME , editText1.getText().toString()); 
values.put(KEY_PSNAME , stringArrayList.get(position));
values.put(KEY_CARD , "12345677"); 
values.put(KEY_CREDITS , "55");

// Inserting Row
db.insert(DATABASE_TABLE, null, values);
db.close(); // Closing database connection

答案 1 :(得分:0)

您的问题相当复杂,从微调器获取选定字段,更新数据库......我不打算提供完整的答案,但这应该可以让您开始:

这是您从微调器获取所选字段的方法,然后您可以使用它来更新数据库。一句警告,我相信setOnItemSelectedListener在最初设置时会被调用,因此您可能需要忽略第一次调用。

Spinner spinner;

spinner.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> arg0, View view, int arg2,
            long arg3) {

        if(! (view instanceof TextView)){
            // view is probably a textview, but record type if not.
            System.out.println("incorrect view type " + view.getClass().getSimpleName());
            return;
        }

        EditText et = (EditText) view;
        String fieldName = et.getText().toString().trim();

        //Now we got selected name, send name 
        //to a function that updates our database.

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }
});
相关问题