2016-12-31 4 views
-1

私はSqlite dbを持っています。ここでは、最新のエントリの最大行数を10に制限しています。ロジックは新しいエントリを挿入するときです。行の数を確認します。すでに10行がある場合は、最も古い入力行が削除され、新しい行が追加されます。しかし、エラーSQLiteException: near "BYid": syntax error (code 1): , while compiling: DELETE FROM profORDER BYid LIMIT 1が発生しています。スペースの不一致やクエリエラーが原因ですか?ローを削除する際の例外

public class SQLiteHandler extends SQLiteOpenHelper { 

private static final String TAG = SQLiteHandler.class.getSimpleName(); 

// All Static variables 
// Database Version 
private static final int DATABASE_VERSION = 1; 

// Database Name 
private static final String DATABASE_NAME = "android_api"; 

// Profile Settings table name 
private static final String TABLE_PROF = "prof"; 

// Profile Settings information names 
private static final String KEY_ID = "id"; 
private static final String KEY_NAME = "name"; 
private static final String KEY_MOBILE = "mobile"; 


public SQLiteHandler(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

// Creating Tables 
@Override 
public void onCreate(SQLiteDatabase db) { 

    String CREATE_PROF_TABLE = "CREATE TABLE " + TABLE_PROF + "("+KEY_ID+" INTEGER PRIMARY KEY, "+KEY_NAME+" TEXT, "+KEY_MOBILE+" TEXT" + ")"; 

    db.execSQL(CREATE_PROF_TABLE); 

    Log.d(TAG, "Database tables created"); 
} 

// Upgrading database 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // Drop older table if existed 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_PROF); 

    // Create tables again 
    onCreate(db); 
} 


/** 
* Storing Prof_settings details in database 
* */ 
public void addProfile(String name, String mobile){ 

    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 

    values.put(KEY_NAME, name); 
    values.put(KEY_MOBILE, mobile); 

    int count = getProfilesCount(); 

    if(count == 10) { 

     String DELETE_ROW = "DELETE FROM " +TABLE_PROF+ "ORDER BY" +KEY_ID+" LIMIT 1"; 

     db.execSQL(DELETE_ROW); // will delete oldest record 
    } 

    long id = db.insert(TABLE_PROF, null, values); // insert to 1st row 
    db.close(); // Closing database connection 

    Log.d(TAG, "New profile settings inserted into sqlite: " + id); 

} 




/** 
* Getting Profile Settings data from database 
* */ 
public ArrayList<HashMap<String, String>> getProfDetails() 
{ 
    ArrayList<HashMap<String, String>> array_list = new ArrayList<HashMap<String, String>>(); 

    SQLiteDatabase db = this.getReadableDatabase(); 
    //Cursor res = db.rawQuery("SELECT * " + " FROM " + TABLE_PROF + " GROUP BY " + KEY_NAME + " ORDER BY " + KEY_MOBILE + " COLLATE NOCASE;", null); 
    String selectQuery = "SELECT * FROM " + TABLE_PROF; 
    Cursor res = db.rawQuery(selectQuery, null); 
    res.moveToFirst(); 

    while (res.isAfterLast() == false) 
    { 
     HashMap<String, String> hashmap= new HashMap<String, String>(); 
     hashmap.put("id", res.getString(res.getColumnIndex(KEY_ID))); 
     hashmap.put("name", res.getString(res.getColumnIndex(KEY_NAME))); 
     hashmap.put("mobile", res.getString(res.getColumnIndex(KEY_MOBILE))); 

     array_list.add(hashmap); 
     res.moveToNext(); 
    } 
    return array_list; 
} 

public int getProfilesCount() { 
    String countQuery = "SELECT * FROM " + TABLE_PROF; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(countQuery, null); 
    int cnt = cursor.getCount(); 
    cursor.close(); 
    return cnt; 
} 

/** 
* Re crate database Delete all tables and create them again 
* */ 
public void deleteUsers() { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    // Delete All Rows 
    db.delete(TABLE_PROF, null, null); 
    db.close(); 

    Log.d(TAG, "Deleted all profile info from sqlite"); 
} 

}

+0

'LIMIT'句がDELETE''で使用することはできません。ちなみに、数日前にこれに似た質問をしませんでしたか? –

+4

'ORDER BY'の前後にスペースを入れてください。 –

+0

'String DELETE_ROW =" DELETE FROM "+ TABLE_PROF +" ORDER BY "+ KEY_ID +" LIMIT 1 "; ' –

答えて

1

変更

"DELETE FROM " +TABLE_PROF+ " ORDER BY " +KEY_ID+" LIMIT 1"; 

にこの

"DELETE FROM " +TABLE_PROF+ "ORDER BY" +KEY_ID+" LIMIT 1"; 

ちょうどORDER BYの前後にスペースを入れます。

@TimBiegeleisenが指摘しているように、LIMIT節はDELETEで機能しません。

回避策の一つはこれです -

"DELETE FROM " + TABLE_PROF 
+ " WHERE someColumn in (" 
+ " SELECT someColumn FROM " + TABLE_PROF + " ORDER BY " + KEY_ID + " LIMIT 1" 
+ ")"; 
+0

はい、LIMITはDELETEで動作しないと思いますが、例外的に 'ORDER 'の近くにあります:構文エラー(コード1):' @Shreyash –

+0

このリンクもチェックしてくださいhttp://stackoverflow.com/これは同様のロジックを示すので、質問/ 31619424/delete-all-but-n-from-database-table-in-sqlite-for-java-android) –

+0

'someColumn'とは何ですか?列名(KEY_NAMEなど)を使用して最初の行を削除できますか? –

0
String DELETE_ROW = "DELETE FROM " +TABLE_PROF+ "ORDER BY" +KEY_ID+" LIMIT 1"; 

これは、このような

String DELETE_ROW = "DELETE FROM " +TABLE_PROF+ " ORDER BY " +KEY_ID+" LIMIT 1"; 

であるべきです。 ORDERの前とBYの後のスペースに注意してください。

関連する問題