2013-12-08 60 views
-1

我知道文檔說在這種情況下使用insert代替execSQL會更好,但是我有一個非常大的包含6000條記錄的sql文件,對我來說使用execSQL更容易,但是它不工作execSQL不能與插入

public class CitiesHandler extends SQLiteOpenHelper { 

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

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

    // Login table name 
    private static final String TABLE_REGION= "region"; 
    private static final String TABLE_CITY= "city"; 
    // Login Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_NAME = "name"; 
    private static final String KEY_REGION_ID = "region_id"; 
    private static final String KEY_PHONE = "phone_code"; 

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

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String strRegion="CREATE TABLE region (id INTEGER PRIMARY KEY,name TEXT)"; 
     db.execSQL(strRegion); 
     String insertRegion="INSERT INTO region Values (1, 'АР Крым') , (2, 'Винницкая область') , (3, 'Волынская область') , (4, 'Днепропетровская область') , (5, 'Донецкая область') , (6, 'Житомирская область') , (7, 'Закарпатская область') , (8, 'Запорожская область') , (9, 'Ивано-Франковская область') , (10, 'Киевская область') , (11, 'Кировоградская область') , (12, 'Луганская область') , (13, 'Львовская область') , (14, 'Николаевская область') , (15, 'Одесская область') , (16, 'Полтавская область') , (17, 'Ровенская область') , (18, 'Сумская область') , (19, 'Тернопольская область') , (20, 'Харьковская область') , (21, 'Херсонская область') , (22, 'Хмельницкая область') , (23, 'Черкасская область') , (24, 'Черниговская область') , (25, 'Черновицкая область')"; 
     db.execSQL(insertRegion); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_CITY); 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_REGION); 
     // Create tables again 
     onCreate(db); 
    } 

    public String[] getRegions(){ 
     HashMap<String,String> user = new HashMap<String,String>(); 
     String selectQuery = "SELECT * FROM " + TABLE_REGION; 

     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     // Move to first row 
     cursor.moveToFirst(); 
     if(cursor.getCount() > 0){ 
      user.put("name", cursor.getString(1)); 
     } 
     cursor.close(); 
     db.close(); 
     String [] regions; 
     regions=new String[user.values().size()]; 
     for (Entry<String, String> entry : user.entrySet()) { 
      int i=0; 
      regions[i] = entry.getValue();  
      i++; 
     } 
     // return user 
     return regions; 
    } 

    public int getRegionID(String name){ 
     HashMap<String,String> user = new HashMap<String,String>(); 
     String selectQuery = "SELECT * FROM " + TABLE_REGION+" WHERE name="+name; 

     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     // Move to first row 
     cursor.moveToFirst(); 
     if(cursor.getCount() > 0){ 
      user.put("id", cursor.getString(0)); 
     } 
     cursor.close(); 
     db.close(); 
     // return user 
     return Integer.valueOf(user.get("id")); 
    } 

    public String[] getCities(int region_id){ 
     HashMap<String,String> user = new HashMap<String,String>(); 
     String selectQuery = "SELECT * FROM " + TABLE_CITY+" WHERE region_id="+String.valueOf(region_id); 

     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     // Move to first row 
     cursor.moveToFirst(); 
     if(cursor.getCount() > 0){ 
      user.put("name", cursor.getString(1)); 
     } 
     cursor.close(); 
     db.close(); 
     String [] cities; 
     cities=new String[user.values().size()]; 
     for (Entry<String, String> entry : user.entrySet()) { 
      int i=0; 
      cities[i] = entry.getValue();  
      i++; 
     } 
     // return user 
     return cities; 
    } 

} 

感謝您的幫助

它不工作 - 這意味着每次它是空的。插入語句沒有完成。

+0

你得到的錯誤是什麼? – Baklap4

+4

隨意解釋「它不工作」的含義。 – CommonsWare

+0

爲什麼不使用SQliteDatabase基本查詢方法...而不是使用rawQuery,因爲你沒有做非常複雜的查詢... – JoxTraex

回答

2

我總是在beginTransaction和EndTransaction之間使用execSQL,你試過了嗎?

這裏是代碼的摘錄:

String cmd = "QUERY FOR EXECUTE"; 
SQLiteDatabase db = dbHelper.getWritableDatabase(); 
db.beginTransaction(); 

if (cmd.trim().length() > 0) { 
    db.execSQL(cmd); 
} 

db.setTransactionSuccessful(); 
db.endTransaction(); 
db.close(); 

確保您有寫權限了。

+0

'onCreate()'已經在一個事務中。 – laalto

+0

這是一個工作謝謝 –

3

我仍然會使用Android提供的insert()。從你的代碼看來,你沒有正確地將參數傳遞給VALUES SQLite命令。有關INSERT INTO的說明,請參閱here

+0

同意。下面是一個[在數據庫事務中使用SQLite插入的示例](http://android.codota.com/scenarios/528e1e21da0ae9404ad3ab53/android.database.sqlite.SQLiteDatabase?tag=bumblebee) – drorw

+0

我會這樣做,但我有大的sql語句並不想解析它 –

+0

這不是一個長期的陳述。我不知道解析是什麼意思,但使用'insert()'仍然是一個更好的選擇。 – Emmanuel