为Android App创建SQLite数据库

时间:2010-09-23 15:37:49

标签: android sqlite

如果不存在,我在运行时为我的App创建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并编写以下查询

从table_name中选择* - 它只是告诉我没有这样的记录存在。我设置了断点,似乎在调用getReadableDatabase()之后,永远不会执行@Override OnCreate()方法,这是我执行Create table SQLs的地方。我试过getWritableDatabase() 同样。

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

感谢。

查询文本字符串#1

private static final String USERAUTH_TABLE_CREATE =      “CREATE TABLE”+ USERAUTH_TABLE_NAME +“(”+      “数字INTEGER NOT NULL,”+      “dip TEXT NOT NULL,”+      “发送电子邮件TEXT NOT NULL,”+      “密码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" + ");";

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

“我是否需要在项目的/ assets文件夹中放置任何内容?”

没有

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

没有

您的语法没问题...您可以粘贴正在创建表格的查询吗?

答案 2 :(得分:0)

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

答案 3 :(得分:0)

问题已解决。代码一直在努力。 sqlite shell没有向我显示表和数据库。当我让我的应用程序在模拟器上运行并导航到数据>数据>你的包名>数据库>使用DDMS的your-database-file系统向我显示SQLite DB创建得很好。我也检查了表格。

谢谢大家!!

答案 4 :(得分:0)

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

检索你已经进入的值,并在文本框中显示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();
        }