2010-09-23 55 views
2

我在运行时为我的应用程序创建SQLite数据库,如果它不存在并插入行,如果它。由于它应该是在运行时创建的,我已经通过创建SQLiteOpenHelper的子类并覆盖了onCreate()方法来实现它 - “我需要在我的项目的/ assets文件夹中放置任何东西吗?”为Android应用程序创建SQLite数据库

我没有使用任何Content Provider“我需要在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的外壳,并编写以下查询

SELECT * FROM表名 - 它只是告诉我没有这样的记录存在。我设置了断点,看起来在getReadableDatabase()被调用后,@Override的OnCreate()方法从未被执行,这是我执行Create table SQL的地方。我也试过getWritableDatabase() 。

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

谢谢。

查询文本字符串#1

私有静态最后字符串USERAUTH_TABLE_CREATE = “CREATE TABLE” + USERAUTH_TABLE_NAME + “(” + “数INTEGER NOT NULL,” + “浸渍TEXT NOT NULL,” + “email TEXT NOT NULL”,+ “password TEXT NOT NULL”,+ “flag INTEGER”+“);” ;

查询文本字符串#2

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

这可能有相关性,也可能没有关系,但可能有帮助:http://code.google.com/p/android/issues/detail?id=1732。 – 2010-09-23 15:58:16

+0

谢谢查理..有用的信息。我将尝试在一次调用中实现表格创作。 – Aakash 2010-09-23 16:07:21

+0

您是否检查过sqlite文件(数据库)是否实际上是在文件系统上创建的(通过DDMS或telnet模拟器)?如果是这样,您可以将该文件从模拟器复制到桌面,并使用SQLitebrowser检查您的表是否已创建。 – ccheneson 2010-09-23 17:53:37

回答

3

如果没有调用onCreate(),那么已经为您的应用程序创建了数据库。解决这个问题的最快方法是在模拟器上(设置 - >应用程序 - >您的应用程序)删除您的项目,然后重新启动您的应用程序。或者,您可以使用ADB来放弃您的数据库 - 这取决于您。在删除数据库后重新启动应用程序将调用onCreate(),因为数据库不存在,然后您的表创建sql将运行。 onCreate()如果你的数据库不存在(所以几乎是第一次调用数据库在你的代码才会被调用。

+0

我一定会尝试这个..但是如果它已经创建时,我查询表不应该说“没有这样的表存在”吧? – Aakash 2010-09-23 16:02:25

+1

如果您在设置两个Table create方法之前通过代码访问数据库,那么数据库将被创建,并且不会再次调用onCreate。如果你第一次运行这段代码,它包含了两个Table创建,然后我们看到一个稍微不同的问题 - 尽管如果表没有被正确创建,你会看到一个堆栈跟踪。 – McStretch 2010-09-23 16:09:41

+0

我没有在我的代码中的任何其他地方访问数据库。只是在这里我试图创建数据库表。 – Aakash 2010-09-23 16:15:56

1

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

没有

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

没有

你的语法是好的...你可以粘贴你正在创建表的查询?

+0

把我的查询创建字符串施工在我的帖子..感谢 – Aakash 2010-09-23 16:01:41

+0

该表创建SQL语句看起来是否正确?我检查了LogCat并没有看到记录的任何错误。 – Aakash 2010-09-23 16:08:30

+0

该陈述看起来正确。相信我,LogCat会炸毁如果语法有问题 - 我已经跑到了很多:) – McStretch 2010-09-23 16:10:40

0

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

+0

呀,我其实。我已将它们设置为字符串,将DATABASE_NAME和DATABASE_VERSION设置为1.对我来说,没有任何评论是愚蠢的。谢谢 – Aakash 2010-09-23 16:14:24

0

当我将我的应用程序在模拟器上运行并导航到data> data> your-package-name>数据库> your-package-name>数据库时,sqlite shell没有向我显示表格和数据库。数据库文件使用DDMS系统显示我的SQLite数据库创建好,我已经检查过这些表是否也有。

谢谢大家!!

0

这个简单的应用将创建数据的基础上和1个表w和在它将

检索的textBox其中u必须enetered值和VL节目结束。

 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(); 
     } 
相关问题