使用android studio在Sqlite数据库中插入列

时间:2017-06-12 12:22:34

标签: android-sqlite

使用android studio在Sqlite数据库中插入列,以及如何将一些列设置为autoincrement和primarykeys

1 个答案:

答案 0 :(得分: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,只有在数据库文件本身不存在时才会调用它(再次应用极少数例外情况)。

然后,如果创建数据库,则在名为 testfloat 的数据库中创建一个表。该表格由2列组成,即 _id myfloat

_id 列类型为 INTEGER PRIMARY KEY ,如果在插入行时没有为列指定值那么它将是一个唯一的递增整数(首先是1,然后是2 ......)。

myfloat 列的类型为 FLOAT (或许是checkout Datatypes In SQLite Version 3,因为SQLite在数据类型方面具有灵活性),如果值为n&# 39;在插入行时给出,然后给出值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有一个空方法。此外,还有两种方法 insertRow (插入一行)和 getAllMyFloats 返回Cursor,在本例中为所有包含所有列的行。

在您调用活动时,您可以执行以下操作: -

    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: -

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子句会横向移动游标。对于每一行,它使用一些cursor.get来获取myfloat列的值。方法(演示如何使值受每个影响)。注意代替getfloats.get????(getfloats.getColumnIndex(column))getfloats.get????(1)可以使用。