2016-12-23 114 views
1

所以在我的应用程序中,我使用get和set方法。当它执行set方法时,应用程序不会崩溃,但当它到达get方法时,它会崩溃。我发现当它到达get方法中的db.query()行时它崩溃了,但我认为问题也可能在set方法中,因为它们都给出错误消息。插入和执行查询在android的sqlite数据库错误

这里是我的代码:

公共类MyDBHandler扩展SQLiteOpenHelper {

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; 
} 

} 

设定功能用在这里:

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); 

    } 




} 


} 

get函数在这里使用:

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

} 

,这里是来自日志的错误消息部分。

这是当集方法被称为:

E/SQLiteLog:(1)附近的 “值”:语法错误 E/SQLiteDatabase:错误插入电流= 0的目标= 2000 android.database.sqlite .SQLiteException:近 “值”:语法错误(代码1):在编译:INSERT INTO值(电流,目标)VALUES

这是当get方法被调用(?,?):

E/SQLiteLog:(1)接近“值”:语法错误 E/AndroidRuntime:FATAL EX CEPTION:main java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.user.calorietracker/com.example.user.calorietracker.Track}:android.database.sqlite.SQLiteException:near“values”:语法错误(代码1):,编译时:SELECT target FROM values LIMIT 1

我已经尝试了很多东西来解决它,但无法弄清楚我做错了什么。从字面上来说,任何建议都会有所帮助!谢谢

+0

将您的表的名称从'values'更改为其他名称或使用双引号来转义表名:'“values”' – Dekel

回答

1

根据SQLite Keywords的列表 - 单词values是您不能用于表(或列或许多其他事物)名称的单词之一。

有几种方法来解决这个问题:

  1. 不要使用这个词。例如,您始终可以使用tbl_values
  2. 你可以引用那个词:

'关键字'        关键字在单引号是一个字符串文字。
“关键字”     双引号中的关键字是标识符。
[keyword]      方括号内的关键字是一个标识符。这不是标准的SQL。此引用机制由MS Access和SQL Server使用,并包含在SQLite中以实现兼容性。
`关键字`     严重重音(ASCII码96)中包含的关键字是一个标识符。这不是标准的SQL。这种引用机制由MySQL使用,并包含在SQLite中用于兼容性。

+0

谢谢!!!我永远不会意识到这一点! – Csbk

+0

欢迎您:)也将赞赏答案以及(左边的箭头)。谢谢! – Dekel