Java 在android sqlite数据库中插入和执行查询时出错
因此,在我的应用程序中,我使用get和set方法。当它执行set方法时,应用程序不会崩溃,但当它到达get方法时,它会崩溃。我发现当它到达get方法中的db.query()行时会崩溃,但我认为问题也可能出在set方法中,因为它们都会给出错误消息 这是我的密码: 公共类MyDBHandler扩展了SQLiteOpenHelper{Java 在android sqlite数据库中插入和执行查询时出错,java,android,sql,sqlite,Java,Android,Sql,Sqlite,因此,在我的应用程序中,我使用get和set方法。当它执行set方法时,应用程序不会崩溃,但当它到达get方法时,它会崩溃。我发现当它到达get方法中的db.query()行时会崩溃,但我认为问题也可能出在set方法中,因为它们都会给出错误消息 这是我的密码: 公共类MyDBHandler扩展了SQLiteOpenHelper{ public static final int DATABASE_VERSION = 1; public static final String COLUMN_ID =
public static final int DATABASE_VERSION = 1;
public static final String COLUMN_ID = "_id";
public static final String TABLE_VALUES = "values";
public static final String COLUMN_TARGET = "target";
public static final String COLUMN_CURRENT = "current";
public MyDBHandler(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String query1 = "CREATE TABLE " + TABLE_VALUES + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
COLUMN_TARGET + " INT, " +
COLUMN_CURRENT + " INT);";
db.execSQL(query1);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_VALUES);
onCreate(db);
}
public void setTarget(int tar){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_TARGET, tar);
values.put(COLUMN_CURRENT, 0);
db.insert(TABLE_VALUES, null, values);
db.close();
}
public int getTarget() {
SQLiteDatabase db = this.getReadableDatabase();
int targetVal=0;
String[] columns = {COLUMN_TARGET};
Cursor c = db.query(TABLE_VALUES, columns, null, null, null, null, String.valueOf(1));
if(c.getCount()>0)
{
c.moveToFirst();
targetVal=c.getInt(0);
}
db.close();
c.close();
return targetVal;
}
}
此处使用set函数:
public class home extends AppCompatActivity {
MyDBHandler db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
db = new MyDBHandler(this);
}
public void enter(View view)
{
EditText target = (EditText) findViewById(R.id.target);
TextView warning = (TextView) findViewById(R.id.warning);
String check = target.getText().toString();
if(check.equals("")) {
// Intent a = new Intent(this, MainActivity.class);
//startActivity(a);
warning.setText("Please enter a value");
return;
}
else {
int input = Integer.parseInt(check);
Log.d("tag", "111\n");
db.setTarget(input);
Log.d("tag", "222\n");
//int i = db.getTarget();
//Log.d("tag","input is " + i );
Intent a = new Intent(this, MainActivity.class);
startActivity(a);
}
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onTrack(View view){
Log.d("tag", "traaaack\n");
Intent i = new Intent(this, Track.class);
startActivity(i);
}
}
此处使用get函数:
public class home extends AppCompatActivity {
MyDBHandler db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
db = new MyDBHandler(this);
}
public void enter(View view)
{
EditText target = (EditText) findViewById(R.id.target);
TextView warning = (TextView) findViewById(R.id.warning);
String check = target.getText().toString();
if(check.equals("")) {
// Intent a = new Intent(this, MainActivity.class);
//startActivity(a);
warning.setText("Please enter a value");
return;
}
else {
int input = Integer.parseInt(check);
Log.d("tag", "111\n");
db.setTarget(input);
Log.d("tag", "222\n");
//int i = db.getTarget();
//Log.d("tag","input is " + i );
Intent a = new Intent(this, MainActivity.class);
startActivity(a);
}
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onTrack(View view){
Log.d("tag", "traaaack\n");
Intent i = new Intent(this, Track.class);
startActivity(i);
}
}
下面是日志中的错误消息部分
此时将调用set方法:
E/SQLiteLog:(1)靠近“值”:语法错误
E/SQLiteDatabase:插入current=0 target=2000时出错
android.database.sqlite.SQLiteException:靠近“值”:编译时语法错误(代码1):插入值(当前、目标)值(?,)
此时将调用get方法:
E/SQLiteLog:(1)靠近“值”:语法错误
E/AndroidRuntime:致命异常:主
java.lang.RuntimeException:无法启动活动组件信息{com.example.user.carriotracker/com.example.user.carriotracker.Track}:android.database.sqlite.SQLiteException:接近“值”:语法错误(代码1):,编译时:从值限制1中选择目标
我已经尝试了很多方法来修复它,但无法找出我做错了什么。任何建议都会很有帮助!根据列表,感谢-单词值是您不能用于表(或列或许多其他内容)名称的单词之一
有几种方法可以解决此问题:
不要使用这个词。例如,您可以始终使用tbl\u值
你可以引用这个词:
“关键字”单引号中的关键字是字符串文字。
“关键字”双引号中的关键字是标识符。
[关键字]方括号中的关键字是标识符。这不是标准SQL。MS Access和SQL Server使用此引用机制,并将其包含在SQLite中以实现兼容性。
`关键字`grave accents(ASCII代码96)中包含的关键字是一个标识符。这不是标准SQL。MySQL使用这种引用机制,为了兼容性,它包含在SQLite中
将您的表名从values
更改为其他名称,或使用双引号转义表名:“values”
不客气:)也希望您能对答案(左侧向上箭头)投赞成票。谢谢!