0

所以我有一个工作 SQL 数据库,它利用 VARCHARs 的所有值。我对此没有任何问题,并将其用于多个应用程序。

我已经意识到,对于我的应用程序的许多部分,微调器会比让用户自己实际输入文本更好,因为它会更快、更漂亮等。

这是我的问题。我似乎无法保存微调器的位置,并且不知道如果我能弄清楚如何检索它。我已经最小化了我的代码,只专注于让它与一个旋转器一起工作,它的数据库只保存两个值。文本视图和微调器。

这是我的代码(应该注意,我正在尝试我能想到的一切。将变量定义为 long、int、object.... 等等,因此可能存在一些代码差异)

数据库开瓶器代码

@Override
public void onCreate(SQLiteDatabase db) {
    String createQuery = "CREATE TABLE country (_id integer primary key     autoincrement,name VARCHAR, save long);";                 
    db.execSQL(createQuery);        
}

DB 连接器代码

 public void insertContact( String name, long choice) 
           {
              ContentValues newCon = new ContentValues();
              newCon.put("name", name);
              newCon.put("save", choice);
               open();
              database.insert("country", null, newCon);
              close();
           }


           public void updateContact(long id, String name, long choice) 
           {
              ContentValues editCon = new ContentValues();
              editCon.put("name",name);
              editCon.put("save", choice);

              open();
              database.update("country", editCon, "_id=" + id, null);
              close();
           }

添加/编辑活动课程

 setContentView(R.layout.add_country);
      spin = (Spinner)findViewById(R.id.spinner1);
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, numbers);
      nameEt = (EditText) findViewById(R.id.nameEdit);
      spin.setOnItemSelectedListener(this);
      spin.setAdapter(adapter);
      Bundle extras = getIntent().getExtras(); 

      if (extras != null)
      {
         rowID = extras.getLong("row_id");
         nameEt.setText(extras.getString("name"));

         spin.setSelection(((ArrayAdapter<?>)spin.getAdapter()).getPosition(null));           }
  private void saveContact() 
   {
      DatabaseConnector dbConnector = new DatabaseConnector(this);

      if (getIntent().getExtras() == null)
      {
          dbConnector.insertContact
          (nameEt.getText().toString(),
           spin.getItemIdAtPosition(choice));
      }
      else
      {
         dbConnector.updateContact(rowID,
            nameEt.getText().toString(),
            spin.getItemIdAtPosition(choice));


      }
   }

public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
        long arg3){
 saved = spin.getSelectedItem().toString(); 
 int choice = spin.getSelectedItemPosition();

}

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

}
}

查看课程

public class ViewCountry extends Activity implements OnClickListener{


   private long rowID;
   private TextView nameTv;

   TextView ep;




   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.view_country);
      Button a = (Button)findViewById(R.id.editbuttons);
       Button b = (Button)findViewById(R.id.deletebuttons);
      a.setOnClickListener(this);
      b.setOnClickListener(this);

      setUpViews();
      Bundle extras = getIntent().getExtras();
      rowID = extras.getLong(CountryList.ROW_ID); 
   }

   private void setUpViews() {
       nameTv = (TextView) findViewById(R.id.nameText);

       ep = (TextView)findViewById(R.id.newText99);

   }

   @Override
   protected void onResume()
   {
      super.onResume();
      new LoadContacts().execute(rowID);
   } 

   private class LoadContacts extends AsyncTask<Long, Object, Cursor> 
   {
      DatabaseConnector dbConnector = new DatabaseConnector(ViewCountry.this);

      @Override
      protected Cursor doInBackground(Long... params)
      {
         dbConnector.open();
         return dbConnector.getOneContact(params[0]);
      } 

      @Override
      protected void onPostExecute(Cursor result)
      {
         super.onPostExecute(result);

         result.moveToFirst();
         // get the column index for each data item
         int nameIndex = result.getColumnIndex("name");

         int epicIndex = result.getColumnIndex("save");


         nameTv.setText(result.getString(nameIndex));

         ep.setText(result.getString(epicIndex));


         result.close();
         dbConnector.close();
      }
   } 


   @Override
   public boolean onCreateOptionsMenu(Menu menu) 
   {
      super.onCreateOptionsMenu(menu);
      MenuInflater inflater = getMenuInflater();
      inflater.inflate(R.menu.view_country_menu, menu);
      return true;
   }


   @Override
   public boolean onOptionsItemSelected(MenuItem item) 
   {
      switch (item.getItemId())
      {
         case R.id.editItem:
            Intent addEditContact =
               new Intent(this, AddEditCountry.class);

            addEditContact.putExtra(CountryList.ROW_ID, rowID);
            addEditContact.putExtra("name", nameTv.getText());

            addEditContact.putExtra("save", ep.getText());

            startActivity(addEditContact); 
            return true;

         case R.id.deleteItem:
            deleteContact();
            return true;

         default:
            return super.onOptionsItemSelected(item);
      } 
   }
   private void deleteContact()
   {

      AlertDialog.Builder alert = new AlertDialog.Builder(ViewCountry.this);

      alert.setTitle(R.string.confirmTitle); 
      alert.setMessage(R.string.confirmMessage); 

      alert.setPositiveButton(R.string.delete_btn,
         new DialogInterface.OnClickListener()
         {
            public void onClick(DialogInterface dialog, int button)
            {
               final DatabaseConnector dbConnector = 
                  new DatabaseConnector(ViewCountry.this);

               AsyncTask<Long, Object, Object> deleteTask =
                  new AsyncTask<Long, Object, Object>()
                  {
                     @Override
                     protected Object doInBackground(Long... params)
                     {
                        dbConnector.deleteContact(params[0]); 
                        return null;
                     } 

                     @Override
                     protected void onPostExecute(Object result)
                     {
                        finish(); 
                     }
                  };

               deleteTask.execute(new Long[] { rowID });               
            }
         }
      );

      alert.setNegativeButton(R.string.cancel_btn, null).show();
   }

抱歉,如果我缺少要给您的数据。我从前三段代码中删减了一堆,以尽量减少阅读时间。让我知道您是否需要其他东西。我已经尝试了我能想到的一切。

这是在调整代码之后

数据库开瓶器

  public void onCreate(SQLiteDatabase db) {
    String createQuery = "CREATE TABLE country (_id integer primary key     autoincrement,name VARCHAR, save int);";                 
        db.execSQL(createQuery);    

DB 连接器类

  public void insertContact( String name, int choice) 
           {
              ContentValues newCon = new ContentValues();
              newCon.put("name", name);
              newCon.put("save", choice);
               open();
              database.insert("country", null, newCon);
              close();
           }


           public void updateContact(long id, String name, int choice) 
           {
              ContentValues editCon = new ContentValues();
              editCon.put("name",name);
              editCon.put("save", choice);

              open();
              database.update("country", editCon, "_id=" + id, null);
              close();
           }

添加/编辑类

我无法确定在哪里插入新的捆绑包和代码。

这就是我所做的

Bundle extras = getIntent().getExtras(); 
      Bundle contact = dbConnector.updateContact(saved);

在这里我收到错误“dbConnector 类型中的方法 updateContact (Long, String, int) 不适用于参数 (String)” if (extras != null) { rowID = extras.getLong("row_id"); nameEt.setText(extras.getString("name")); spin.setSelection(((ArrayAdapter)spin.getAdapter()).getPosition(null));} String name = contact.getString("name"); int position = contact.getInt("位置"); 自旋.setSelection(位置);

现在在这里,稍后在同一个活动中我得到一个类似的错误

       private void saveContact() 
   {


      if (getIntent().getExtras() == null)
      {
          dbConnector.insertContact
          (nameEt.getText().toString(),
           spin.getItemIdAtPosition(choice));

这里它说“dbconnector 类型中的方法 insertContact (String, int) 不适用于参数 (String, long)”

我不知道它在哪里得到了很长的时间,因为我已经在我想的任何地方都删除了它。} else { dbConnector.updateContact(rowID, nameEt.getText().toString(), spin.getItemIdAtPosition(choice));

此处出现“dbconnector 类型中的方法 insertContact (long, String, int) 不适用于参数 (long String, long)”

      }
   }

public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
        long arg3){
 saved = spin.getSelectedItem().toString(); 

这些是目前我唯一的错误。我觉得我处于边缘,但无法弄清楚最后一个问题到底在哪里。

4

1 回答 1

0

一些东西....

1:

在您的saveContact()方法中,您有以下代码:

spin.getItemIdAtPosition(choice));

但是,choice您引用的变量是在方法内部声明和实例化的onItemSelected。一旦完成运行,choice您将无法使用。相反,将它声明为上面的类变量,就像你做你的spinnameEt变量一样,并将它填充到onItemSelected. 然后你可以参考它:

spin.getItemIdAtPosition(this.choice));

2:

insertContactupdateContact方法都期望这个位置很长。Spinner您使用getItemIdAtPosition() 方法发送它们,该方法将返回一个 int!

3:

您不会在任何地方从数据库中更新微调器!您必须在数据库中查询姓名和职位。然后使用 Spinner 方法setSelection(int position)

// I'm assuming a method in your dbConnecter called "getContact" that returns 
// a Bundle which contains a name and position.  I'm also assuming you have the
// id of the contact you want.  I'm calling it "contactId".

    Bundle contact = dbConnector.getContact(contactId);

    String name  = contact.getString("name");
    int position = contact.getInt("position");

    nameEt.setText(name);
    spin.setSelection(position)
于 2013-06-18T06:35:27.843 回答