【发布时间】:2013-06-14 01:42:20
【问题描述】:
所以我有一个有效的 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);
}
数据库连接器代码
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);
数据库连接器类
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)” 如果(额外!= null) { rowID = extras.getLong("row_id"); nameEt.setText(extras.getString("name")); spin.setSelection(((ArrayAdapter)spin.getAdapter()).getPosition(null));} 字符串名称 = contact.getString("name"); int position = contact.getInt("位置"); spin.setSelection(位置);
现在在这里,稍后在同一个活动中我得到一个类似的错误
private void saveContact()
{
if (getIntent().getExtras() == null)
{
dbConnector.insertContact
(nameEt.getText().toString(),
spin.getItemIdAtPosition(choice));
这里说“dbconnector 类型中的方法 insertContact (String, int) 不适用于参数 (String, long)”
我不知道它在哪里得到了长,因为我已经在我想的任何地方都删除了它。 } 别的 { 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();
这些是我目前唯一的错误。我觉得我处于边缘,但无法弄清楚最后一个问题到底在哪里。
【问题讨论】:
-
当您说它不起作用时.. 这到底是什么意思?此外,当您创建表时,SQLite 中没有“长”数据类型。使用整数。您仍然可以使用 getLong 检索它并通过将 long 传递给您的 ContentValues 来保存它
-
它不仅似乎没有保存位置,而且我不知道如何返回它。
-
当我将代码更改为所有 int 而不是 long 它给我错误“类型 databaseConnector 中的方法 insertContact 不适用于以下参数(Long,string,int)”然后它告诉我把它改回长
-
我认为 dymmeh 的意思是在你的 SQL 表声明中将 long 更改为整数,而不是在你的联系方法中。
标签: android database android-spinner