【问题标题】:SQLite Database creation for Android App为 Android 应用程序创建 SQLite 数据库
【发布时间】:2010-09-23 15:37:49
【问题描述】:

如果我的应用程序不存在,我将在运行时为它创建我的 SQLite 数据库,如果存在则插入行。因为它应该在运行时创建,我通过创建 SQLiteOpenHelper 的子类并覆盖 onCreate() 方法来实现它 -

“我需要在我的项目的 /assets 文件夹中放任何东西吗?”

我没有使用任何内容提供程序“我需要在 AndroidManifest.xml 中添加任何标签吗?”

这就是我所做的。字符串已正确定义,我没有收到任何运行时异常。

SQLiteOpenHelper 子类的实现。

public class MyDB extends SQLiteOpenHelper {

                   public MyDB(Context context) {
                    super(context, DATABASE_NAME, null,  DATABASE_VERSION );
                   }

                @Override
                public void onCreate(SQLiteDatabase db) {
                db.execSQL(USERAUTH_TABLE_CREATE);
                db.execSQL(USERPREF_TABLE_CREATE); 
                }

                @Override
                public void onUpgrade(SQLiteDatabase db, int oldVersion, int 
                newVersion) {
                    Log.w("Example", "Upgrading database, this will drop tables and
                    recreate.");
                    db.execSQL("DROP TABLE IF EXISTS " +  USERAUTH_TABLE_NAME);
                    db.execSQL("DROP TABLE IF EXISTS " +  USERPREF_TABLE_NAME);
                    onCreate(db);
               }

}

这里是我创建 SQLiteOpenHelper 的 MyDB 子类实例的地方。

MyDB tdb = new MyDB(Activity.this); 
SQLiteDatabase db = tdb.getReadableDatabase();

一切都在运行,当我进入 sqlite shell 并编写以下查询时

select * from table_name - 它只是告诉我不存在这样的记录。我设置了断点,似乎在调用 getReadableDatabase() 之后,永远不会执行 @Override OnCreate() 方法,这是我执行创建表 SQL 的地方。我试过 getWritableDatabase() 也是。

我不明白为什么没有创建表。如果有人可以提供帮助,那就太好了。

谢谢。

查询文本字符串#1

私有静态最终字符串 USERAUTH_TABLE_CREATE = "创建表" + USERAUTH_TABLE_NAME + " (" + “数字整数不为空,”+ "dip TEXT NOT NULL," + “电子邮件文本不为空,”+ "密码文本不为空," + "标志整数" + ");" ;

查询文本字符串#2

private static final String USERPREF_TABLE_CREATE = 
 "CREATE TABLE " + USERPREF_TABLE_NAME + " (" +
 "tpd TEXT NOT NULL ," +
 "cat TEXT NOT NULL" + ");";

【问题讨论】:

  • 这可能相关也可能不相关,但无论哪种方式都可能有所帮助:code.google.com/p/android/issues/detail?id=1732
  • 谢谢查理..有用的信息。我将尝试在一次调用中实现表创建。
  • 您是否检查过 sqlite 文件(数据库)是否实际上是在文件系统上创建的(通过 DDMS 或 telnet 模拟器)?如果是,您可以将文件从模拟器复制到您的桌面,并使用 SQLitebrowser 检查您的表是否已创建。

标签: android sqlite


【解决方案1】:

如果onCreate() 未被调用,则数据库已为您的应用创建。解决它的最快方法是删除模拟器上的项目(设置->应用程序->您的应用程序),然后重新启动您的应用程序。或者,您可以使用 ADB 来删除您的数据库——这取决于您。删除数据库后重新启动应用程序将调用onCreate(),因为数据库不存在,然后将运行您的表创建sql。 onCreate() 仅在您的数据库不存在时才被调用(几乎是您第一次在代码中调用数据库时。

【讨论】:

  • 我一定会试试这个..但是如果它是在我查询表时创建的,它不应该说“不存在这样的表”对吗?
  • 如果您在设置两个表创建方法之前完全通过代码访问了数据库,那么数据库将已创建并且不会再次调用 onCreate。如果您第一次运行此代码时它包含两个 Table 创建,那么我们将看到一个稍微不同的问题 - 尽管如果没有正确创建表,您会看到一个堆栈跟踪。
  • 我没有在我的代码中的其他任何地方访问数据库。我只是在这里尝试创建数据库表。
  • 您是否在表中插入了任何记录?我刚刚意识到您遇到了“不存在记录”的问题,而不是表格。
  • 很可能是 Aakash 有一个空版本的 onCreate,然后尝试使用已经创建的空数据库。清除应用程序的数据,或增加数据库的版本号并覆盖 onUpgrade 方法。
【解决方案2】:

“我需要在我的项目的 /assets 文件夹中放任何东西吗?”

没有

“我需要在 AndroidManifest.xml 中添加任何标签吗?”

没有

您的语法没问题...您可以粘贴您为创建表所做的查询吗?

【讨论】:

  • 表创建SQL语句看起来正确吗?我检查了 LogCat 并没有看到任何错误记录。
  • 陈述看起来正确。相信我,如果语法出现问题,LogCat 会崩溃——我已经遇到过很多问题了 :)
  • 我还没有插入任何记录。但是sqlite说不存在这样的表。我传递给构造函数的上下文是否有任何问题?
  • 您是否尝试在模拟器中删除您的应用程序,或者像石英建议的那样,提高版本号?
【解决方案3】:

这可能是一个愚蠢的问题,但是您是否定义了 DATABASE_NAME 和 DATABASE_VERSION 变量?

【讨论】:

  • 是的,我确实有。我已将 DATABASE_NAME 和 DATABASE_VERSION 的字符串设置为 1。没有评论对我来说很愚蠢。谢谢
【解决方案4】:

问题已解决。代码再次正常工作。 sqlite shell 没有向我显示表和数据库。当我让我的应用程序在模拟器上运行并使用 DDMS 导航到 data > data > your-package-name > databases > your-database-file 时,系统显示 SQLite DB 已创建良好。我也检查了那里的表格。

谢谢大家!!

【讨论】:

    【解决方案5】:

    这个简单的应用程序将创建一个数据库和 1 个表 w,最后它会

    检索你输入的值并在文本框中显示。

           SQLiteDatabase myDB= null;
            String TableName="Profile";
            String ShowData="";
    
            /* This function create new database if not exists. */
            try {
                myDB = openOrCreateDatabase("DataBase.db",SQLiteDatabase.CREATE_IF_NECESSARY, null);
    
            /* Create a Table in the Database. */
            myDB.execSQL("CREATE TABLE IF NOT EXISTS "+ TableName + " (id INT(4),firstname VARCHAR,lastname VARCHAR);");
    
            /* Insert data to a Table*/
            //myDB.execSQL("INSERT INTO "+ TableName    +"(id, firstname, lastname) "+ " VALUES (1, 'Pir', 'Fahim');");
             Toast.makeText(this," DATA BASE HAVE BEEN CREATED ", Toast.LENGTH_SHORT).show();
    
             /*Fetch data from database table */
            Cursor c = myDB.rawQuery("SELECT* FROM " + TableName , null);
    
            int id = c.getColumnIndex("id");
            int fristName = c.getColumnIndex("firstname");
            int lastName = c.getColumnIndex("lastname");
    
            // Check result.
            c.moveToFirst();
            if (c != null) {
            // Loop through all Results
            do {
            int personId = c.getInt(id);
            String FirstName = c.getString(fristName);
            String LastName = c.getString(lastName);
            ShowData =ShowData +personId+" .) "  +FirstName+" "+LastName+"\n";
    
            txt.append("********************"+"\n"+personId+"\n"+FirstName+"\n"+LastName+"\n");
      // Toast.makeText(this," RESULT 2 IS = "+ ShowData, Toast.LENGTH_LONG).show();
            }
    
            while(c.moveToNext());
            }           
            // Toast.makeText(this," RESULT 2 IS = "+ ShowData, Toast.LENGTH_LONG).show();
            }
            catch(Exception e) 
            {
            Toast.makeText(this, "Error = "+e.getMessage(), Toast.LENGTH_LONG).show();
            } 
            finally 
            {
            if (myDB != null)
            myDB.close();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多