为什么未在SQLite Android Studio 3.1.4或3.2.1中创建表

时间:2018-10-25 11:56:58

标签: android-sqlite

为什么未在SQLite Android Studio 3.1.4或3.2.1中创建表 我在Android Studio 3.1上在家中使用此代码可以完美地工作,但是在学校中使用的3.1.4和3.2.1中,它可以使数据库而不是表可以使用。

我已经使用logcat来打印查询并将其粘贴到数据库浏览器中,它可以完美地工作并创建表。我已经在onCreate()方法中完成了多个Log.d,以确认代码正在到达该方法中,并且代码也已到达该方法中。

public class SQLCon extends SQLiteOpenHelper
 {
    public static final String DBNAME = "unidb.db";
    public static int VER = 1;
    private SQLiteDatabase db;

    final String CREATEUSERTABLE = "CREATE Table IF NOT EXISTS "+
            ContractSQL.User.TABLE_NAME+"( "+
            ContractSQL.User.ID+" INTEGER PRIMARY KEY autoincrement,"+
            ContractSQL.User.FN+" varchar(45),"+
            ContractSQL.User.SN+" varchar(45),"+
            ContractSQL.User.EM+" varchar(45),"+
            ContractSQL.User.GROUP+" varchar(45),"+
            ContractSQL.User.PW+ " varchar(45));";

    public SQLCon(Context context) {
        super(context, DBNAME, null, VER);

 this.getWritableDatabase();
        //onCreate(this.getWritableDatabase());
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.d("CREATEUSERTABLETAG", CREATEUSERTABLE);

        db.execSQL(CREATEUSERTABLE);
        //this.getWritableDatabase().execSQL(CREATEUSERTABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

}


Contract Class:



 public final class ContractSQL
 {
    private ContractSQL(){}

    public static class User
    {
        public static final String TABLE_NAME = "_user_";
        public static final String ID = "_id_";
        public static final String FN = "_fn_";
        public static final String SN = "_sn_";
        public static final String GROUP = "_group_";
        public static final String PW = "_pw_";
        public static final String EM = "_em_";
    }

}

1 个答案:

答案 0 :(得分:0)

分别将上述代码复制到SQLCon.java和ContractSQL.java中,然后使用以下活动从活动中使用代码:-

public class MainActivity extends AppCompatActivity {

    AdminSQLiteOpenHelper mASQLiteHlpr;
    SQLCon mSQLcon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSQLcon = new SQLCon(this);
        Cursor csr = mSQLcon.getWritableDatabase().query("sqlite_master",null,null,null,null,null,null);
        while (csr.moveToNext()) {
            Log.d("DBINFO", "Found Item " + csr.getString(csr.getColumnIndex("name")));
        }
        csr.close();
    }
}

工作正常,并在日志中显示以下内容:-

10-25 19:40:37.311 1164-1164/axtest.axtest D/CREATEUSERTABLETAG: CREATE Table IF NOT EXISTS _user_( _id_ INTEGER PRIMARY KEY autoincrement,_fn_ varchar(45),_sn_ varchar(45),_em_ varchar(45),_group_ varchar(45),_pw_ varchar(45));
10-25 19:40:37.311 1164-1164/axtest.axtest D/DBINFO: Found Item android_metadata
10-25 19:40:37.311 1164-1164/axtest.axtest D/DBINFO: Found Item _user_
10-25 19:40:37.311 1164-1164/axtest.axtest D/DBINFO: Found Item sqlite_sequence
  • android_metadata是由android可用的SQLite代码创建的表(用于区域设置)。
  • 创建
  • sqlite_sequence的原因是您已编码AUTOINCREMENT。它包含迄今为止使用的最高 rowid (除非已修改)。
    • 编码?? INTEGER PRIMARY KEY(带有或不带有AUTOINCREMENT)会使列?? (在您的情况下为 id )特殊列 rowid 的别名。 rowid 是无符号的64位整数。最初将是1,然后通常将增加1(尽管不能保证会)。
    • AUTOINCREMENT有开销,并且仅引入 rowid 必须始终较大的约束。很少需要,建议不要使用AUTOINCREMENT。SQLite Autoincrement

这样,您似乎没有在使用声音方法检查表是否存在(上面的代码中包含声音方法的示例),或者由于环境不同而存在一些外部约束。

采用上面的代码查询 sqlite_master 表,将显示是否正在创建该表。