我在SQLite数据库中有一个表。在Android Studio中,出现此错误:
Caused by: android.database.sqlite.SQLiteException: near "add": syntax
error (code 1): , while compiling: SELECT id, onvan, matn,
nevisande, tasvir, fav, khande, ezafi, address, pdfname,
downloaded, add, buy FROM dastanha
这是我的DataBaseAdapter:
public class DBAdapter {
public static final String KEY_ID = "id";
public static final String KEY_ONVAN = "onvan";
public static final String KEY_MATN = "matn";
public static final String KEY_NEVIS = "nevisande";
public static final String KEY_IMG = "tasvir";
public static final String KEY_FAV = "fav";
public static final String KEY_KHAND = "khande";
public static final String KEY_EXTRA = "ezafi";
public static final String KEY_ADDRESS = "address";
public static final String KEY_PDFNAME = "pdfname";
public static final String KEY_DOWNLOADED = "downloaded";
public static final String KEY_ADD = "add";
public static final String KEY_BUY = "buy";
public static final String DATABASE_NAME = "dastanha";
public static final String DATABASE_TABLE = "dastanha";
public static final String TAG = "book";
static final String CREATE_TABLE = "CREATE TABLE "+DATABASE_TABLE+" ("+KEY_ID+" INTEGER PRIMARY KEY NOT NULL ,"
+KEY_ONVAN+" TEXT,"+KEY_MATN+" TEXT,"+KEY_NEVIS+" TEXT,"
+ KEY_IMG+" TEXT,"+KEY_FAV+" INTEGER NOT NULL DEFAULT (0) ,"
+KEY_KHAND+" INTEGER NOT NULL DEFAULT (0) ,"+KEY_EXTRA+" TEXT,"
+KEY_ADDRESS+" TEXT,"+KEY_PDFNAME+" TEXT DEFAULT (null) , "
+KEY_DOWNLOADED+" INTEGER NOT NULL DEFAULT 0, "
+KEY_ADD+" INTEGER NOT NULL DEFAULT 0, "
+KEY_BUY+" INTEGER NOT NULL DEFAULT 0)";
String[] yek_name = new String[] { KEY_ID, KEY_ONVAN, KEY_MATN, KEY_NEVIS,
KEY_IMG, KEY_FAV, KEY_KHAND, KEY_EXTRA, KEY_ADDRESS, KEY_PDFNAME, KEY_DOWNLOADED, KEY_ADD, KEY_BUY };
final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db;
public DBAdapter(Context ctx) {
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
// DATABASE_VERSION = 8
super(context, DATABASE_NAME, null, 8);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_TABLE);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
onCreate(db);
}
}
public DBAdapter open() throws SQLException {
db = DBHelper.getWritableDatabase();
return this;
}
public void close() {
DBHelper.close();
}
public List<Dastan> getAllContacts() {
Cursor cursor = db.query(DATABASE_TABLE, yek_name, null, null, null,
null, null);
List<Dastan> nams = cursorToList(cursor);
return nams;
}
private List<Dastan> cursorToList(Cursor cursor) {
List<Dastan> nams = new ArrayList<Dastan>();
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
Dastan nam = new Dastan();
nam.setId(cursor.getInt(cursor.getColumnIndex(KEY_ID)));
nam.setOnvan(cursor.getString(cursor.getColumnIndex(KEY_ONVAN)));
nam.setMatn(cursor.getString(cursor.getColumnIndex(KEY_MATN)));
nam.setNevisande(cursor.getString(cursor.getColumnIndex(KEY_NEVIS)));
nam.setTasvir(cursor.getString(cursor.getColumnIndex(KEY_IMG)));
nam.setFav(cursor.getInt(cursor.getColumnIndex(KEY_FAV)));
nam.setKhande(cursor.getInt(cursor.getColumnIndex(KEY_KHAND)));
nam.SetEzafi(cursor.getString(cursor.getColumnIndex(KEY_EXTRA)));
nam.SetAddress(cursor.getString(cursor.getColumnIndex(KEY_ADDRESS)));
nam.SetPdfname(cursor.getString(cursor.getColumnIndex(KEY_PDFNAME)));
nam.setDownloaded(cursor.getInt(cursor.getColumnIndex(KEY_DOWNLOADED)));
nam.setAdd(cursor.getInt(cursor.getColumnIndex(KEY_ADD)));
nam.setBuy(cursor.getInt(cursor.getColumnIndex(KEY_BUY)));
nams.add(nam);
};
return nams;
}
public Dastan getContact(int new_id) throws SQLException {
List<Dastan> nams = new ArrayList<Dastan>();
Cursor cursor = db.query(true, DATABASE_TABLE, yek_name, KEY_ID
+ " == '" + new_id + "'", null, null, null, null, null);
Dastan nam = new Dastan();
if (cursor != null) {
cursor.moveToFirst();
nams = cursorToList(cursor);
}
return nams.get(0);
}
// /search
public List<Dastan> findContacts(String nam, String row)
throws SQLException {
Cursor cursor = db.query(true, DATABASE_TABLE, yek_name, row
+ " LIKE '%" + nam + "%'", null, null, null, null, null);
List<Dastan> nams = cursorToList(cursor);
return nams;
}
// /fav?
public List<Dastan> findFAVContacts() throws SQLException {
Cursor cursor = db.query(true, DATABASE_TABLE, yek_name, KEY_FAV
+ " == " + 1 + "", null, null, null, null, null);
List<Dastan> nams = cursorToList(cursor);
return nams;
}
public List<Dastan> findKhandeContacts() throws SQLException {
Cursor cursor = db.query(true, DATABASE_TABLE, yek_name, KEY_KHAND
+ " == " + 1 + "", null, null, null, null, null);
List<Dastan> nams = cursorToList(cursor);
return nams;
}
// ---updates a contact---
public boolean updateContact(Dastan up_nam) {
ContentValues args = new ContentValues();
args.put(KEY_ID, up_nam.getId());
args.put(KEY_ONVAN, up_nam.getOnvan());
args.put(KEY_MATN, up_nam.getMatn());
args.put(KEY_NEVIS, up_nam.getNevisande());
args.put(KEY_IMG, up_nam.getTasvir());
args.put(KEY_FAV, up_nam.getFav());
args.put(KEY_KHAND, up_nam.getKhande());
args.put(KEY_EXTRA, up_nam.getEzafi());
args.put(KEY_ADDRESS, up_nam.getAddress());
args.put(KEY_PDFNAME, up_nam.getPdfname());
args.put(KEY_DOWNLOADED, up_nam.getDownloaded());
args.put(KEY_ADD, up_nam.getAdd());
args.put(KEY_BUY, up_nam.getBuy());
return db.update(DATABASE_TABLE, args, KEY_ID + "=" + up_nam.getId(),
null) > 0;
}
}
并且:
public class Dastan implements Parcelable{
private int id;
private String onvan;
private String matn;
private String nevisande;
private String tasvir;
private int fav;
private int khande;
private String ezafi;
private String address;
private String pdfname;
private int downloaded;
private int add;
private int buy;
public Dastan (){
}
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public String getOnvan(){
return onvan;
}
public void setOnvan(String onvan){
this.onvan = onvan;
}
public String getMatn (){
return matn;
}
public void setMatn(String matn){
this.matn = matn;
}
public String getNevisande(){
return nevisande;
}
public void setNevisande(String nevisande){
this.nevisande = nevisande;
}
public String getTasvir(){
return tasvir;
}
public void setTasvir(String tasvir){
this.tasvir = tasvir;
}
public int getFav(){
return fav;
}
public void setFav(int fav){
this.fav = fav;
}
public int getKhande(){
return khande;
}
public void setKhande(int khande){
this.khande = khande;
}
public String getEzafi(){
return ezafi;
}
public void SetEzafi(String ezafi){
this.ezafi = ezafi;
}
public String getAddress(){
return address;
}
public void SetAddress(String address){
this.address = address;
}
public String getPdfname(){
return pdfname;
}
public void SetPdfname(String pdfname){
this.pdfname = pdfname;
}
public int getDownloaded(){
return downloaded;
}
public void setDownloaded(int downloaded){this.downloaded = downloaded;}
public int getAdd(){return add;}
public void setAdd(int add){this.add = add;}
public int getBuy(){return buy;}
public void setBuy(int buy){this.buy = buy;}
public Dastan (Parcel in){
id = in.readInt();
onvan = in.readString();
matn = in.readString();
nevisande = in.readString();
tasvir = in.readString();
fav = in.readInt();
khande = in.readInt();
ezafi=in.readString();
address=in.readString();
pdfname=in.readString();
downloaded = in.readInt();
add = in.readInt();
buy = in.readInt();
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int arg1) {
// TODO Auto-generated method stub
dest.writeInt(id);
dest.writeString(onvan);
dest.writeString(matn);
dest.writeString(nevisande);
dest.writeString(tasvir);
dest.writeInt(fav);
dest.writeInt(khande);
dest.writeString(ezafi);
dest.writeString(address);
dest.writeString(pdfname);
dest.writeInt(downloaded);
dest.writeInt(add);
dest.writeInt(buy);
}
public static final Parcelable.Creator<Dastan> CREATOR = new Parcelable.Creator<Dastan>() {
@Override
public Dastan createFromParcel(Parcel arg0) {
// TODO Auto-generated method stub
return new Dastan(arg0);
}
@Override
public Dastan[] newArray(int arg0) {
// TODO Auto-generated method stub
return new Dastan[arg0];
}
};
}
和Logcat:
08-16 14:10:24.038 14377-14377/com.example.ava.book3 E/SQLiteLog: (1) near "add": syntax error
08-16 14:10:24.039 14377-14377/com.example.ava.book3 D/AndroidRuntime: Shutting down VM
08-16 14:10:24.039 14377-14377/com.example.ava.book3 E/AndroidRuntime: FATAL EXCEPTION: main
Process:
com.example.ava.book3, PID: 14377
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ava.book3/com.example.ava.book3.MainActivity}: android.database.sqlite.SQLiteException: near "add": syntax error (code 1): , while compiling: SELECT id, onvan, matn, nevisande, tasvir, fav, khande, ezafi, address, pdfname, downloaded, add, buy FROM dastanha
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.database.sqlite.SQLiteException: near "add": syntax error (code 1): , while compiling: SELECT id, onvan, matn, nevisande, tasvir, fav, khande, ezafi, address, pdfname, downloaded, add, buy FROM dastanha
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1202)
at com.example.ava.book3.DBAdapter.getAllContacts(DBAdapter.java:126)
at com.example.ava.book3.MainActivity.onCreate(MainActivity.java:118)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-16 14:10:24.063 1727-2422/system_process W/ActivityManager: Force finishing activity com.example.ava.book3/.MainActivity
我不知道怎么了。请帮我。预先感谢。
答案 0 :(得分:4)
ADD
是SQLite中的reserved keyword,用于add columns to an existing table。
SQL标准指定了大量的关键字,这些关键字不能用作表,索引,列,数据库,用户定义的函数,归类,虚拟表模块或任何其他命名对象的名称。
因此,您应该为列使用其他名称,或者,如果绝对需要,则可以使用keywords documentation page上定义的以下方法之一:
如果要使用关键字作为名称,则需要引用它。在SQLite中有四种引用关键字的方法:
- “关键字” 。单引号中的关键字是字符串文字。
- “关键字” 用双引号引起来的关键字是标识符。
- [关键字] 用方括号括起来的关键字是一个标识符。
这不是标准的SQL。这种引用机制由MS Access和SQL Server使用,并且包含在SQLite中以实现兼容性。
答案 1 :(得分:3)
您不能将add
或ADD
用作键,因为它是SQLite中的保留关键字(观看所有here)。
您应该使用替代方法,例如added
(不好,非常类似于add
)或plus
或其他任何方法。
尝试将add
中的public static final String KEY_ADD = "add";
替换为另一个非保留的String
。