2014-03-16 2 views
0

Я пытаюсь обновить текущий столбец кредитов единственной строки в базе данных, используя выпадающий счетчик, который получает значения от arraylist. Очень не уверен, как это сделать. Спасибо за любую помощь заранее.Обновление определенного столбца с помощью виджета spinner

Мой код базы данных:

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); 
} 
} 
+0

Вы хотите обновить счетчик данными из своей БД или обновить существующие данные в БД с помощью счетчика? –

+0

Обновите БД с помощью счетчика, используя значения, хранящиеся в String [] money = {«Выберите количество», «£ 1», «£ 2», «£ 5», «£ 10»}; – user3408604

ответ

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 

    } 
}); 
0

я не нашел эту проблему, но я могу вам сказать, что ваш код ОЧЕНЬ НЕВИДИМО. Вы используете String, чтобы построить свой результат в методе getData. Каждый раз, когда вы пытаетесь добавить новые данные (Row) в старый, вы создаете новый 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 
+0

Хорошо, спасибо вам за это! Также как мне получить данные, предварительно определенные в таблице базы данных. Я знаю, что я должен использовать INSERT INTO, но не могу найти хороший пример, как я пытался раньше, но когда я пытаюсь просмотреть строки базы данных, ничего не было вставлено. – user3408604

+0

@ user3408604 проверить мой обновленный ответ с примером, который поможет вам понять –

Смежные вопросы