2014-01-05 3 views
1

Я пытаюсь использовать и несколько HTTP-запросов для заполнения нескольких таблиц в базе данных для android-приложения. Когда эти таблицы заполняются, часть данных из таблиц будет заполнять и расширять представление. Проблема в том, что я получаю сообщение об ошибке, указывающее, что созданная мной таблица не создается.База данных Android - Нет такой ошибки таблицы

Error Log:

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);, но я все еще получаю ошибку, что таблица не существует.

+0

почему вы используете 'KEY_ID, Key_Title, Key_Description' имена столбцов идентификатор, название и описание. –

+0

Какая базовая база данных вы используете? Как правило, 'varchar' как тип требует максимальной длины (что-то вроде' varchar (255) '). –

+0

@RohanKandwal Я отредактировал DBHelper.java, чтобы прояснить Key_ID, Key_Title, Key_Description ... Спасибо – user908759

ответ

3

onCreate вашего класса DBHelper будет вызываться только при первом открытии приложения и вызове класса.

Возможно, вы столкнулись с? lvl2List?

Если это так, попробуйте переустановить приложение и повторите попытку.

При добавлении/изменении таблиц SQL используйте метод onUpgrade. См official documentation

Также в вашем onCreate методе DBHelper вы «съедая» SQLException - не делать этого - это может иметь интересную информацию для вас ;-)

поедая Exception я имею в виду, что вы «молча» обрабатываете исключение и двигаетесь дальше.

Это ваш onCreate метод 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. 
    } 
} 

Обратите внимание на catch -clause. Здесь вы должны хотя бы сделать e.printStacktrace(); или Log.e(e);.

В вашем случае вы, возможно, ничего не узнали из этого ведения журнала, потому что метод onCreate был вызван только при первом запуске приложения.

Смотрите эту SO post о проблеме или просто поиск по Google - это известный «вопрос» «поведение»/мы, как программисты склонны делать ;-)

Хороший след о том, как обрабатывать исключения, может можно найти here.

0

Я знаю, что эта тема устарела и решена. Но я хотел бы включить этот совет для других людей, таких как я, имеющих ту же проблему. Попробуйте включить .db в имени файла, как:

private static final String Database_Name = "MyDBs.db"; 

Это решило проблему для меня

Смежные вопросы