【问题标题】:No such table even though db.execSQL(sql) executes without an error即使 db.execSQL(sql) 执行没有错误,也没有这样的表
【发布时间】:2014-07-01 08:32:38
【问题描述】:

我有一个奇怪的问题要解决。系统正确调用 SQLiteOpenHelper onCreate() 方法,并且似乎 db.execSQL(sql) 成功,但从未创建表。

我正在使用“adb devices”访问 VM >> cd 进入 /data/data/package/databases >> sqlite3 以运行 .tables。如果我执行“从帖子中选择 *”,结果是“没有这样的表”。感谢您的指导。

已编辑

我添加了 MainActivity 类以表明我确实调用了 .getWritableDatabase()。当我这样做时,我可以看到调用了 onCreate 方法并且没有任何错误,但是当我检查表是否存在时......它不是。

DatabaseHelper.java

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.util.ArrayList;

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String TAG = "DnDa";

    public static final String DATABASE_NAME = "db-rss.db";
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_TABLE = "posts";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_TITLE = "title";
    public static final String COLUMN_LINK = "link";
    public static final String COLUMN_DESCRIPTION = "description";
    public static final String COLUMN_PUBDATE = "pubdate";
    public static final String COLUMN_CATEGORY = "category";
    public static final String COLUMN_GUID = "guid";

    private Post post;
    private ArrayList<Post> posts;
    private Cursor cursor;

    /**
     * constructor
     * @param context
     */
    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) throws SQLiteException {
        String sql = String.format("CREATE TABLE %s ( %s INTEGER PRIMARY KEY AUTOINCREMENT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT )",
                DATABASE_TABLE, COLUMN_ID, COLUMN_TITLE, COLUMN_LINK, COLUMN_DESCRIPTION, COLUMN_PUBDATE, COLUMN_CATEGORY, COLUMN_GUID);

        try {
            db.execSQL(sql);
            Log.d(TAG, "Successfully created table: " + sql);
        } catch (SQLiteException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS" + DATABASE_TABLE;
        db.execSQL(sql);

        this.onCreate(db);
    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        Log.d(TAG, "Opening database");
    }

    /**
     * Retrieve all records
     */
    public Cursor getAllRecords(SQLiteDatabase db) {
        db = this.getReadableDatabase();
        cursor = db.query(DATABASE_TABLE, new String[] {COLUMN_TITLE, COLUMN_PUBDATE, COLUMN_DESCRIPTION}, null, null, null, null, null);
        return cursor;
    }

}

MainActivity.java

public class MainActivity extends ActionBarActivity {
    private static final String TAG = "DnDa";

    private String finalUri = "http://wordpress.com/feed/";
    private DatabaseHelper databaseHelper;
    private SQLiteDatabase database;
    private Post post;
    private ArrayList posts;
    private ScrollView scrollView;
    private ListView listView;
    private SimpleCursorAdapter dataAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        databaseHelper = new DatabaseHelper(this);
        database = databaseHelper.getWritableDatabase();
    }


}

【问题讨论】:

  • 这不是您创建表的方式。尝试这样的操作--> "create table "+DATABASE_TABLE+" ("+COLUMN_ID+" INTEGER PRIMARY KEY, "... 等等。
  • 出于好奇,为什么有人会将此问题标记为否定?我问了一个愚蠢的问题吗?在在这里发布我的问题之前,我进行了多次 Google 搜索以寻找解决方案。
  • 发布问题时,您必须具体说明您的问题。您应该发布代码以及错误或您的 logcat。这有助于其他人回答您的问题。如果您只提供正确和完整的信息,那么有人可以正确地帮助您。

标签: android oncreate sqliteopenhelper


【解决方案1】:

很遗憾您的表没有创建。试试这个SQL Create Table 命令

 String sql = "CREATE TABLE "+DATABASE_TABLE+" ( "+
   COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+
   COLUMN_TITLE+" TEXT,"+
   COLUMN_LINK+" TEXT,"+
   COLUMN_DESCRIPTION+" TEXT,"+
   COLUMN_PUBDATE+" TEXT,"+
   COLUMNCOLUMN_CATEGORY+" TEXT,"+
   COLUMN_GUID+" TEXT)"

 db.execSQL(sql);

【讨论】:

  • 我尝试了两种方法来创建 sql 语句(String 和 String.format)。 .execSQL() 方法似乎运行得很好,因为它不会给我一个错误,但该表从未创建。
【解决方案2】:

您是否在DatabaseHelper 对象上调用getWritableDatabase()?可能你有这样的problem

== 编辑 ==

我已经用你的DatabaseHelperActivity 中的代码创建了一个项目:

DatabaseHelper mOpenHelper = new DatabaseHelper(this);
SQLiteDatabase db = mOpenHelper.getWritableDatabase();

Cursor с = mOpenHelper.getAllRecords(db);

效果很好,光标包含三列,没有例外。

【讨论】:

  • 很高兴知道代码有效。我确实调用了 getWritableDatabase 方法,但没有创建表。我需要指定数据库名称吗?
【解决方案3】:

好的;我觉得自己像个傻瓜。每次执行代码时都会成功创建表。问题是我在没有指定数据库的情况下运行了“sqlite3”。现在我实际上正在管理正确的数据库,我可以看到该表就在那里。

http://developer.android.com/tools/help/sqlite3.html

sqlite3 /data/data/<package>/databases/<database-name>.db

再次感谢您的贡献和测试我的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2018-06-21
    相关资源
    最近更新 更多