2017-06-12 46 views

回答

0

如果設置列類型爲INTEGER PRIMARY KEY,如果你不指定值插入一行時,則一個值(64位有符號整數)將被分配一個未使用的整數,通常大於最大值。

您很可能不需要使用AUTOINCREMENT關鍵字(這會分配一個在數據庫內而不是在表級別唯一的整數,因此在確定該整數時會有開銷)。

使用常見_id,所以會經常會看到

db.execSQL("CREATE TABLE tablename (_id INTEGER PRIMARY KEY, column_name column_type, ...more column_name/column_types as required...);");

作爲一個例子,以下代碼使用SQLiteOpenHelper(未需要的,但經常使用的),的一個子類,其需要一個onCreate方法(,在創建數據庫時調用,例如第一次使用助手時使用)和onUpgrade方法(如果版本號增加/增加,則需要)。

該代碼將創建,如果需要的話,數據庫名爲MYDB (文件名mydb.sqlite用於支持擴展超過3個字符更高版本的操作系統)。

  • 如果需要的話只是一次一些罕見的例外除非數據庫被刪除。即onCreate在每次構建幫助程序的實例時都不會調用,只有在數據庫文件本身不存在時纔會調用onCreate(同樣適用罕見的例外情況)。

然後,如果創建數據庫,則在數據庫中創建一個名爲testfloat的表。該表將由2列組成,即_idmyfloat

_id列類型是INTEGER PRIMARY KEY,如果插入行和當該列沒有指定值,那麼這將是一個獨特的遞增的整數(1起初,然後2 ... ...)。

myfloat列的類型FLOAT(也許爲SQLite的在問候靈活性數據類型結帳Datatypes In SQLite Version 3),如果插入一行然後0.0的值將給出當未給出一個值。

public class MyDBHelper extends SQLiteOpenHelper { 

    public static final String DBNname = "mydb"; 
    public static final int DBVersion = 1; 
    public static final String TESTFLOATTABLE = "testfloat"; 
    public static final String STDIDCOL = "_id INTEGER PRIMARYKEY"; 
    public static final String MYFLOATCOL = "myfloat"; 
    public static final String MYFLOATTYPE = " FLOAT DEFAULT 0.0"; 

     public MyDBHelper(Context context) { 
      super(context,DBNname,null,DBVersion); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL("CREATE TABLE " + 
        TESTFLOATTABLE + 
        "(" + 
        STDIDCOL + 
        "," + 
        MYFLOATCOL + 
        MYFLOATTYPE + 
        ")"); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldeversion, int newversion) { 

     } 

     public long insertRow(double myfloatvalue) { 
      long rv; 
      SQLiteDatabase db = getWritableDatabase(); 
      ContentValues cv = new ContentValues(); 
      cv.put(MYFLOATCOL,myfloatvalue); 
      rv = db.insert(TESTFLOATTABLE,null,cv); 
      return rv; 
     } 

     public Cursor getAllMyFloats() { 
      Cursor rv; 
      SQLiteDatabase db = getReadableDatabase(); 
      rv = db.query(TESTFLOATTABLE,null,null,null,null,null,null); 
      return rv; 
     } 
    } 

上面的代碼中有onUpgrade的空方法。此外,還有兩種方法可以返回一個Cursor,在這種情況下,包含所有列的所有行都可以使用insertRow(插入一行)和getAllMyFloats

在你調用的活動,你可以沿着線做一些事情: -

MyDBHelper mydbhelper = new MyDBHelper(this); 
    mydbhelper.insertRow(1.3); 
    mydbhelper.insertRow(1); 
    mydbhelper.insertRow(5.674389123459834); 

第一行獲得一個MyDBHelper實例,它第一次運行時會創建數據庫,並在此過程中調用onCreate方法,從而創建表格。

接下來的三行調用insertRow方法(注意,如果應用程序重新運行,將會添加3個額外的行........即代碼用於演示),這將導致添加3行,第一將在_id列有1,在接下來的2等

下面的代碼(從上面的代碼下面上)顯示獲取和詢問一光標: -

Cursor getfloats = mydbhelper.getAllMyFloats(); 
Log.d("TESTFLOAT","Rows returned from getALlFloats = " + getfloats.getCount()); 
while (getfloats.moveToNext()) { 
    Log.d("TESTFLOAT","Via getString = " + getfloats.getString(getfloats.getColumnIndex(mydbhelper.MYFLOATCOL))); 
    Log.d("TESTFLOAT","Via getFloat = " + Float.toHexString(
      getfloats.getFloat(
        getfloats.getColumnIndex(
          mydbhelper.MYFLOATCOL 
        ) 
      ) 
    )); 
    Log.d("TESTFLOAT","Via getDouble = " +Double.toString(
      getfloats.getDouble(
        getfloats.getColumnIndex(
          mydbhelper.MYFLOATCOL 
        ) 

      ))); 
} 
getfloats.close(); 

第一行調用返回遊標的getAllMyFLoats。 下一行將顯示一條日誌消息,詳細說明生成的遊標中有多少行。 如果遊標中有任何行,則while子句將橫切遊標。對於每一行,它都會得到myfloat列的值,使用一些cursor.get ?????方法(以演示如何使每個值受到影響)。請注意,而不是getfloats.get????(getfloats.getColumnIndex(column)),getfloats.get????(1)將工作。

相關問題