Несколько ContentProviders Android с одним и тем же именем базы данных вызывают исключение «нет такой таблицы»

При использовании одного и того же имени базы данных для нескольких ContentProviders запрос завершается с ошибкой с выдачей исключения как «нет такой таблицы».

Я исследовал справочники, книги, интернет-обсуждения, но решения не нашел.

Я заметил, что все ContentProviders терпят неудачу, кроме одного ContentProvider, объявленного первым в манифесте. Поэтому я дал уникальное имя базы данных, и исключение исчезло. Это работает, но странно иметь несколько баз данных с одной таблицей.

Я хочу выяснить, почему возникает проблема, если это возможно. Ниже моя реализация по существу.

Все ContentProviders имеют отдельный SQLiteOpenHelper, определенный как внутренний закрытый класс. DATABASE_NAME и DATABASE_VERSION — это одно и то же.

public class TheFirstProvider extends ContentProvider {

    private static final String DATABASE_NAME = "dbname.db";
    private static final int DATABASE_VERSION = 1;

    private SQLiteOpenHelper dbHelper;

    @Override
    public boolean onCreate(){
        mContext = getContext();
        dbHelper = new FirstDbHelper(mContext, DATABASE_NAME, null, DATABASE_VERSION);
    }

    private class FirstDbHelper extends SQLiteOpenHelper {
         ...
        private static final String DATABASE_CREATE_FIRST = ... ;

        @Override
        public void onCreate(SQLiteDatabase db){
            db.execSQL(DATABASE_CREATE_FIRST);
        }
    }

person seongjoo    schedule 05.12.2012    source источник


Ответы (2)


Проверьте свой оператор Create table и убедитесь, что он был правильно выполнен, и посмотрите, имеет ли таблица, которую вы используете в запросе, то же имя, что и созданная. Иногда небольшая ошибка в DDL (инструкция создания) приводит к таким проблемам, которые происходят незаметно.

Я также предлагаю вам установить этот плагин eclipse для визуализации базы данных. на вашем эмуляторе, чтобы вы могли увидеть созданные вами таблицы и проверить, соответствуют ли они вашим ожиданиям.

person Alécio Carvalho    schedule 05.12.2012
comment
О, я действительно потратил довольно много времени на проверку заявления. Но я пришел к выводу, что это утверждение не является проблемой, поскольку во время onCreate() журнал не сообщается. - person seongjoo; 05.12.2012

     private class FirstDbHelper extends SQLiteOpenHelper{      
     public FirstDbHelper(Context context) {
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        String query="Your Query";
        db.execSQL(query);
    }

Установите свой код, как показано ниже. Он будет работать.

person Nirav Tukadiya    schedule 05.12.2012