SQLite查询未创建表;没有产生错误

时间:2018-11-13 23:43:41

标签: java android sqlite

我正在尝试使用SQLite创建表,但是Create Table查询似乎不起作用。当我在在线查看器中打开.db文件时,该文件中没有数据/表(附加)。调试时没有出现任何错误;问题。我一直在删除旧的.db文件,并确保onCreate代码正在运行。

https://wsi.li/OzOSD2tTsB1qua/

下面的数据库帮助程序代码:

package com.example.lewis.food;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "Food.db";
    public static final String TABLE_NAME = "food_table";
    public static final String ID = "ID";
    public static final String DESCRIPTION = "DESCRIPTION";
    public static final String INGREDIENTS = "INGREDIENTS";
    public static final String METHOD = "METHOD";
    public static final String NOTES = "NOTES";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
        try {
            SQLiteDatabase db = this.getWritableDatabase();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(" CREATE TABLE " + TABLE_NAME + " (" +
                        ID + " TEXT PRIMARY KEY, " +
                        DESCRIPTION + " TEXT, " +
                        INGREDIENTS + " TEXT, " +
                        METHOD + " TEXT, " +
                        NOTES + " TEXT NOT NULL);"
        );

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

1 个答案:

答案 0 :(得分:0)

问题1。

onUpgrade方法是onCreate方法的一部分,将其移到onCreate方法之外。例如:-

public class DatabaseHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "Food.db";
    public static final String TABLE_NAME = "food_table";
    public static final String ID = "ID";
    public static final String DESCRIPTION = "DESCRIPTION";
    public static final String INGREDIENTS = "INGREDIENTS";
    public static final String METHOD = "METHOD";
    public static final String NOTES = "NOTES";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
        try {
            SQLiteDatabase db = this.getWritableDatabase();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(" CREATE TABLE " + TABLE_NAME + " (" +
                ID + " TEXT PRIMARY KEY, " +
                DESCRIPTION + " TEXT, " +
                INGREDIENTS + " TEXT, " +
                METHOD + " TEXT, " +
                NOTES + " TEXT NOT NULL);"
        );
    }

    @Override
    public void onUpgrade (SQLiteDatabase db,int oldVersion, int newVersion){
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}
  • 请注意,这很可能就是您输入了错误的代码,因为显示的代码很可能无法编译。

问题2。

您可能在错误的位置查找数据库/表。

以下作为调用活动的代码(代码中使用了MainActivity)将确认正在创建数据库以及表,还将打印出数据库的位置:-

public class MainActivity extends AppCompatActivity {

    DatabaseHelper mDBHlpr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDBHlpr = new DatabaseHelper(this);

        Cursor csr = mDBHlpr.getReadableDatabase().query("sqlite_master",null,null,null,null,null,null);
        Log.d("DBLOCATION",this.getDatabasePath(DatabaseHelper.DATABASE_NAME).getAbsolutePath());
        while (csr.moveToNext()) {
            Log.d(
                    "DBINFO",
                    "Found a " + csr.getString(csr.getColumnIndex("type")) +
                            " named " + csr.getString(csr.getColumnIndex("name"))
            );
        }
        csr.close();
    }
}

运行时(仅使用上面的代码),结果为:-

11-14 00:33:23.565 1246-1246/? D/DBLOCATION: /data/data/so53291104.so53291104/databases/Food.db
11-14 00:33:23.565 1246-1246/? D/DBINFO: Found a table named android_metadata
11-14 00:33:23.565 1246-1246/? D/DBINFO: Found a table named food_table
11-14 00:33:23.565 1246-1246/? D/DBINFO: Found a index named sqlite_autoindex_food_table_1

上面的代码创建了数据库,表和食物列上的索引(除非它已经存在),然后记录了有关实际数据库的一些信息。

  • 请注意,DBLOCATION将取决于您的软件包,并且与上面的软件包不同。

  • 您可能希望在运行任何经过修改的代码之前删除该应用程序的数据或卸载该应用程序。