2012-03-04 57 views
0

嗨,朋友。我試圖將一些數據存儲到一個2表數據庫中。下面是它的定義:Android多人sql數據庫錯誤

public class SQLManager { 

public static String KEY_ROWID = "_id"; 
public static final String KEY_PRODUCT = "product"; 
public static final String KEY_QUANTITY = "quantity"; 
public static final String KEY_PRICE = "price"; 

public static final String KEY_DATA = "user data"; 

private static final String DATABASE_NAME = "PedidoDc"; 
private static final String DATABASE_TABLE1 = "PedidoTable"; 
private static final String DATABASE_TABLE2 = "DatosTable"; 

private static final int DATABASE_VERSION = 1; 

private DbHelper ourHelper; 
private final Context ourContext; 
private SQLiteDatabase ourDatabase; 

private static class DbHelper extends SQLiteOpenHelper{ 

    public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL("CREATE TABLE " + DATABASE_TABLE1 + " (" + 
       KEY_ROWID + " INTEGER PRIMARY KEY, " + 
       KEY_PRODUCT + " TEXT NOT NULL, " + 
       KEY_QUANTITY + " TEXT NOT NULL, " + 
       KEY_PRICE + " TEXT NOT NULL);" 

     ); 

     db.execSQL("CREATE TABLE " + DATABASE_TABLE2 + " (" + 
       KEY_ROWID + " INTEGER PRIMARY KEY, " + 
       KEY_DATA + " TEXT NOT NULL);" 

     ); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE1); 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE2); 
     onCreate(db); 

    } 


} 

public SQLManager(Context c){ 

    ourContext = c; 

} 

public SQLManager open() throws SQLException{ 

    ourHelper = new DbHelper(ourContext); 
    ourDatabase = ourHelper.getWritableDatabase(); 
    return this; 
} 

    public void close(){ 

    ourHelper.close(); 

} 

    public long createEntry(String product, String quantity, String price) { 
// TODO Auto-generated method stub 
ContentValues cv = new ContentValues(); 
cv.put(KEY_PRODUCT, product); 
cv.put(KEY_QUANTITY, quantity); 
cv.put(KEY_PRICE, price); 

return ourDatabase.insert(DATABASE_TABLE1, null, cv); 
    } 

    public long createEntry2(String data) { 
// TODO Auto-generated method stub 
ContentValues cv = new ContentValues(); 
cv.put(KEY_DATA, data); 
return ourDatabase.insert(DATABASE_TABLE2, null, cv); 
    } 



    public String getData() { 
// TODO Auto-generated method stub 
String[] columns = new String[]{ KEY_ROWID, KEY_PRODUCT, KEY_QUANTITY, KEY_PRICE}; 
Cursor c = ourDatabase.query(DATABASE_TABLE1, columns, null, null, null, null, null); 
String result = ""; 

int iRow = c.getColumnIndex(KEY_ROWID); 
int iProduct = c.getColumnIndex(KEY_PRODUCT); 
int iQuantity = c.getColumnIndex(KEY_QUANTITY); 
int iPrice = c.getColumnIndex(KEY_PRICE); 

for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
    result = result + " " + c.getString(iQuantity) + " " + c.getString(iProduct) + "      " + c.getString(iPrice) + "\n"; 
} 

return result; 
    } 

    public String getUserData() { 
// TODO Auto-generated method stub 
String[] columns = new String[]{ KEY_ROWID, KEY_DATA}; 
Cursor c = ourDatabase.query(DATABASE_TABLE2, columns, null, null, null, null, null); 
String result = ""; 

int iRow = c.getColumnIndex(KEY_ROWID); 
int iData = c.getColumnIndex(KEY_DATA); 

for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
    result = result + " " + c.getString(iData) + "\n"; 
} 

return result; 
    } 
    public void deleteEntry(long l) { 
// TODO Auto-generated method stub 

ourDatabase.delete(DATABASE_TABLE1, null, null); 


    } 

    public String getQuantity(long l) { 
// TODO Auto-generated method stub 
String[] columns = new String[]{KEY_ROWID, KEY_QUANTITY, KEY_PRODUCT ,KEY_PRICE}; 
Cursor c = ourDatabase.query(DATABASE_TABLE1, columns, KEY_ROWID + "=" + l, null, null, null, null); 
if (c != null){ 
    c.moveToFirst(); 
    String quantity = c.getString(1); 
    c.close(); 
    return quantity; 



} 
return null; 
    } 

    public String getProduct(long l) { 
// TODO Auto-generated method stub 
String[] columns = new String[]{KEY_ROWID, KEY_QUANTITY, KEY_PRODUCT ,KEY_PRICE}; 
Cursor c = ourDatabase.query(DATABASE_TABLE1, columns, KEY_ROWID + "=" + l, null, null, null, null); 
if (c != null){ 
    c.moveToFirst(); 
    String product = c.getString(2); 
    c.close(); 
    return product; 
} 
return null; 

    } 

    public String getPrice(long l) { 
// TODO Auto-generated method stub 

String[] columns = new String[]{KEY_ROWID, KEY_QUANTITY, KEY_PRODUCT ,KEY_PRICE}; 
Cursor c = ourDatabase.query(DATABASE_TABLE1, columns, KEY_ROWID + "=" + l, null, null, null, null); 
if (c != null){ 
    c.moveToFirst(); 
    String price = c.getString(3); 
    c.close(); 
    return price; 
} 
return null; 
    } 


    } 

這是我使用的一些數據存儲到第二個表的代碼:

  SQLManager entry = new SQLManager(ConfirmaData.this); 
      entry.open(); 
      entry.createEntry2(tlf); 
      entry.close(); 

當TLF是一個字符串變量。

我得到這個錯誤:

E /數據庫(27790):android.database.sqlite.SQLiteException:近 「數據」:語法錯誤:,在編譯:INSERT INTO DatosTable(用戶數據)VALUES( ?);

有什麼想法?

謝謝!

回答

1

我認爲錯誤是由於含列名空間

public static final String KEY_DATA = "user data"; 

除去空間和data

+0

是啊!那是我的錯誤。仍然沒有工作,但現在它拋出另一條消息。謝謝! – Aldridge1991 2012-03-04 16:21:46

0

我沒有太多的SQL經驗,但你有沒有嘗試設置ID AUTOINCREMENT?既然你不手動添加它?

+0

之間user至於我知道這不是必要的,因爲數據庫會自動執行它。另外,我需要的是,當db的內容被刪除時,rowID再次從1開始。有了AUTOINCREMENT,這是無法完成的。 – Aldridge1991 2012-03-04 16:04:06

+0

我忘了提一件事,謝謝;) – Aldridge1991 2012-03-04 16:04:35

+0

然後做一個'cv.put(「KEY_ROWID」,id);' – 2012-03-04 16:07:47

0

您不在'createEntry2'方法中指定KEY_ROWID。

,您可以撥打KEY_ROWID爲自動增量值

db.execSQL("CREATE TABLE " + DATABASE_TABLE2 + " (" + 
    KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
    KEY_DATA + " TEXT NOT NULL);" 
) 
+0

我想KEY_ROWID必須對每個表不同,對吧? – Aldridge1991 2012-03-04 16:16:03

+0

不同的表格可以包含具有相同名稱「_id」的列。兩個表都包含一個KEY_ROWID列,並且它是有效的。 – 2012-03-04 16:35:59