Android数据库 - 没有这样的表错误

时间:2014-01-05 20:44:41

标签: android sql httprequest

我正在尝试使用和一些http请求来填充数据库中的几个表和Android应用程序。填充这些表时,表中的部分数据将填充和展开视图。问题是我收到一个错误,告诉我我创建的表没有创建。

错误日志:

01-05 13:33:29.811: E/SQLiteLog(1823): (1) no such table: lvl2List

01-05 13:33:29.831: E/AndroidRuntime(1823): android.database.sqlite.SQLiteException: no such table: lvl2List (code 1): , while compiling: SELECT id, Title, Description FROM lvl2List

这是我的代码:

MainActivity.java

public class MainActivity extends Activity 
{
    private List<lvItem> myLVItems = new ArrayList<lvItem>();
    private List<Parent> myParent = new ArrayList<Parent>();
    ExpandableListView exv;
    final DBHelper db2 = new DBHelper(this);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        exv=(ExpandableListView)findViewById(R.id.expandableListView1);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        db2.open();

        lvl3 lvl3Item = new lvl3();
        lvl3Item.popDB(db2, myParent);
    }
}

DBHelper.java

public class DBHelper 
{
    private static final String Database_Name = "MyDBs";
    private static final int Database_Version = 2;

    public static final String Key_ID = "id";
    public static final String Key_Title = "Title";
    public static final String Key_Summary = "Summary";
    public static final String Key_Book = "Book";
    public static final String Key_Chapter = "Chapter";
    public static final String Key_Description = "Description";
    public static final String Key_SourceType = "SourceType";

    private static final String Lvl3_Table_Name = "lvl3";
    private static final String Lvl2_Table_Name = "lvl2List";
    private static final String Lvl1_Table_Name = "lvl1List";

    private static final String Lvl3_Create = "CREATE TABLE IF NOT EXISTS lvl3 (id integer primary key autoincrement, "
        +"Summary VARCHAR, Book VARCHAR, Chapter VARCHAR, Description VARCHAR, SourceType VARCHAR);";
    private static final String Lvl2_Create = "CREATE TABLE IF NOT EXISTS lvl2List (id integer primary key autoincrement, "
        +"Title VARCHAR, Description VARCHAR);";
    private static final String Lvl1_Create = "CREATE TABLE IF NOT EXISTS lvl1List (id integer primary key autoincrement, "
        +"Title VARCHAR, Description VARCHAR);";

    public DBHelper(Context ctx) {
        this.context = ctx;
        DBhelper = new DatabaseHelper(context);
    }

    private static class DatabaseHelper extends SQLiteOpenHelper
    {
        DatabaseHelper(Context context)
        {
            super(context, Database_Name, null, Database_Version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) 
        {
            try
            {
                db.execSQL(Lvl3_Create);
                db.execSQL(Lvl2_Create);
                db.execSQL(Lvl1_Create);
            }catch(SQLException e){

            }

        }

        public long insertLvl2Record(String Title, String Description)
        {
            ContentValues initialValues = new ContentValues();
            initialValues.put(Key_Title, Title); 
            initialValues.put(Key_Description, Description); 

            return db.insert(Lvl2_Table_Name, null, initialValues);
        }

        public long insertLvl3Record(String Summary, String Book, String Chapter, String Description, String SourceType)
        {
            ContentValues initialValues = new ContentValues();
            initialValues.put(Key_Summary, Summary); 
            initialValues.put(Key_Book, Book); 
            initialValues.put(Key_Chapter, Chapter); 
            initialValues.put(Key_Description, Description); 
            initialValues.put(Key_SourceType, SourceType); 

            return db.insert(Lvl3_Table_Name, null, initialValues);
        }

        public int getLvl2Count()
        {
            Cursor c = db.query(Lvl2_Table_Name, new String[] {Key_ID, Key_Title,Key_Description}, 
            null, null, null, null, null);

            return c.getCount();
        }

        public int getLvl3Count()
        {
            Cursor c = db.query(Lvl3_Table_Name, new String[] {Key_ID, Key_Summary,Key_Book,Key_Verse,Key_Scripts,Key_Description,Key_SourceType}, null, null, null, null, null);

            return c.getCount();
        }

lvl3.java

public class lvl3
{
    DBHelper db2;
    List<Parent> parent;
    public void popDB(DBHelper db, List<Parent> myParent) 
    {
        this.db2 = db;
        this.parent = myParent;
        Lvl3Thread lvl3theard = new Lvl3Thread();
        lvl3theard.execute();
    }
    public class Lvl3Thread extends AsyncTask<String, Integer, String>{
        @Override
        protected String doInBackground(String... params) 
        {
            //Httprequest that get the data for the database… this works
        }
        @Override
        protected void onPostExecute(String result) 
        {
            lvl2 lvl2Item = new lvl2();
            lvl2Item.popDB(db2, parent);
        }
    }
}

lvl2.java

public class lvl3
{
    DBHelper db2;
    List<Parent> parent;
    public void popDB(DBHelper db, List<Parent> myParent) 
    {
        this.db2 = db;
        this.parent = myParent;
        Lvl3Thread lvl3theard = new Lvl3Thread();
        lvl3theard.execute();
    }
    public class Lvl3Thread extends AsyncTask<String, Integer, String>{
        @Override
        protected String doInBackground(String... params) 
        {
            //Httprequest that get the data for the database… this works
        }
        @Override
        protected void onPostExecute(String result) 
        {
            lvl2 lvl2Item = new lvl2();
            lvl2Item.popDB(db2, parent);
        }
    }
    public void popLvl2List(DBHelper db)
    {
        List<lvItem> childlvItems = new ArrayList<lvItem>();
        Cursor cLvl3 = db.getAllLvl3Records();
        db.getLvl2Count(); //This is where the error is coming from stating that there is no lvl2List table
    }
}

我尝试使用db2.detLvl2Count();,但这不起作用。如果我评论该行out the program will run. I have tried reordering the db.execSQL so that db.execSQL(Lvl2_Create);是第一个,但我仍然得到该表不存在的错误。

2 个答案:

答案 0 :(得分:3)

只有在您第一次打开应用程序并调用该类时,才会调用onCreate类的

DBHelper

您是否有机会稍后添加lvl2List表?

如果是,请尝试重新安装该应用,然后重试。

添加/更改SQL表时,请使用onUpgrade方法。请参阅official documentation

同样在您onCreate的{​​{1}} DBHelper方法中,您需要&#34;进食&#34; SQLException - 不要这样做 - 它可能会为您提供有趣的信息; - )

Exception我的意思是,你默默地&#34;处理异常并继续前进。

这是onCreate的<{1}}方法:

DatabaseHelper

注意@Override public void onCreate(SQLiteDatabase db) { try { db.execSQL(Lvl3_Create); db.execSQL(Lvl2_Create); db.execSQL(Lvl1_Create); } catch (SQLException e) { // Handle a possible exception here. } } - 子句。在这里,您至少应该catche.printStacktrace();

在您的情况下,您可能没有完成此日志记录,因为Log.e(e);方法仅在您第一次安装和启动应用程序时调用。

关于此问题,请参阅此SO post或仅搜索Google - 这是一个已知问题&#34; /&#34;行为&#34;我们作为程序员倾向于做; - )

可以找到关于如何处理异常的良好信息here

答案 1 :(得分:0)

我知道这个话题已经过时并且已经解决了。但是我想把这个提示包含在像我一样的其他人有同样的问题。尝试在文件名中包含.db,如:

Order.where(...).fetch({withRelated: 'items'}).then(...)

这解决了我的问题