2017-06-12 50 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)将工作。

相关问题