首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么SQLite Android studio 3.1.4或3.2.1没有创建表?

为什么SQLite Android studio 3.1.4或3.2.1没有创建表?
EN

Stack Overflow用户
提问于 2018-10-25 19:56:58
回答 1查看 154关注 0票数 0

为什么表格不是在SQLite Android studio 3.1.4或3.2.1中创建的?我在家里使用这个代码在Android studio 3.1上工作得很好,但在我在学校使用的3.1.4和3.2.1中,它可以创建数据库,但不能创建表。

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

代码语言:javascript
复制
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_";
    }

}
EN

回答 1

Stack Overflow用户

发布于 2018-10-26 04:02:32

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

代码语言:javascript
复制
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();
    }
}

工作正常,并在日志中生成以下内容:

代码语言:javascript
复制
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代码创建的表(它用于locale).
  • sqlite_sequence,因为您已经编写了AUTOINCREMENT。它包含到目前为止使用的最高行It (除非修改)。
    • coding ?? INTEGER PRIMARY KEY (自动递增或不自动递增)使列??(在本例中为id)特殊列rowid的别名。rowid是一个无符号的64位整数。它最初将是1,然后通常会递增1(尽管不能保证它会递增)。
    • AUTOINCREMENT有开销,并且只引入了一个约束,即rowid必须始终更大。很少需要它,因此建议不要使用AUTOINCREMENT.SQLite Autoincrement

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52988726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档