Получение такой ошибки таблицы с Sugarorm 1.4 в Android

Я получаю следующую ошибку, когда пытаюсь выполнить операции CRUD на моей БД с использованием sugarorm:

E/SQLiteLog: (1) no such table: CONTACT D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.sinha.abhishek.demoapp, PID: 2133
              android.database.sqlite.SQLiteException: no such table: CONTACT (code 1): , while compiling: SELECT * FROM CONTACT WHERE id=? LIMIT 1
                  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
                  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
                  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
                  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
                  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
                  at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163)
                  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034)
                  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1240)
                  at com.orm.SugarRecord.find(SugarRecord.java:192)
                  at com.orm.SugarRecord.findById(SugarRecord.java:102)
                  at com.example.sinha.abhishek.demoapp.Contact.<init>(Contact.java:31)
                  at com.example.sinha.abhishek.demoapp.MainActivity$1.onClick(MainActivity.java:48)
                  at android.view.View.performClick(View.java:4785)
                  at android.view.View$PerformClick.run(View.java:19888)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:135)
                  at android.app.ActivityThread.main(ActivityThread.java:5276)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:911)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706) 

Кто-нибудь может подсказать, пожалуйста, что может быть причиной этого и как это можно исправить.

Это мой класс pojo:

public class Contact extends SugarRecord{

     int contactid;
     String firstName;
     String lastName;
     int age;
     String address;
     String phone;

    public Contact(){
        super();
    }

    public Contact(int contactid, String firstName, String lastName, int age, String address, String phone){
        this.contactid = contactid;
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.address = address;
        this.phone= phone;

    }


}

Это мой файл манифеста Android:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sinha.abhishek.demoapp">

    <application
        android:name="com.orm.SugarApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">



        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <meta-data
            android:name="DATABASE"
            android:value="hollywoodcontacts.db" />
        <meta-data
            android:name="VERSION"
            android:value="2" />
        <meta-data
            android:name="QUERY_LOG"
            android:value="true" />
        <meta-data
            android:name="DOMAIN_PACKAGE_NAME"
            android:value="com.example.sinha.abhishek.demoapp" />



    </application>

</manifest>

Это мой пример кода для операции CRUD, написанный в основной деятельности:

Contact  con  = new Contact(101 ,"Abcd","Xyz",22,"myaddress", "9849848943");
con.save();

Я уже пробовал варианты, такие как: 1. Отключение мгновенного запуска 2. Contact.findById(Contact.class, (long) 1);

но ничего из этого не сработало для меня.

Структура каталогов моего проекта

3 ответа

Возможно, проблема в мгновенном запуске Android Studio ( известная проблема SugarORM), попробуйте отключить ее (дополнительную помощь можно найти здесь).

Тем не менее, эти ответы не помогли мне с той же проблемой, и я думаю, что это не поможет вам, потому что у вас есть allowBackup="true" заявлено в вашем манифесте. Попробуйте установить его false, запустите ваше приложение и удалите> переустановите его.

Почему я думаю, что это проблема: я обнаружил, что мои настройки сохранялись даже после переустановки. Если это также происходит с поврежденной таблицей SQL (из-за мгновенного запуска), то даже переустановка не исправит это. Моя проблема была сразу исправлена ​​после изменения параметра allowBackup на false и повторной установки.

Я пока не могу воспроизвести ошибку, поэтому не могу воспроизвести и исправление, но это мое лучшее предположение. Надеюсь, это вам тоже поможет!

Убедитесь, что у вас есть правильное имя пакета домена. Он генерирует таблицы до этих пакетов. Этот пакет должен иметь ваши классы SugarRecord.

 <meta-data
        android:name="DOMAIN_PACKAGE_NAME"
        android:value="com.example.sinha.abhishek.demoapp.(yourmodelpackage)" />

Когда вы обновите свой вопрос, ваши пакеты выглядят хорошо. Проблема в том, что вы добавили в ваш пакет contactctid, который определяется как настраиваемое поле для сахара orm. Потому что у сахара orm есть собственная реализация id, и findById работает над этим.

Пожалуйста, обновите ваш класс, как показано ниже;

public class Contact extends SugarRecord{

 String firstName;
 String lastName;
 int age;
 String address;
 String phone;

public Contact(){
    super();
}

public Contact(long contactid, String firstName, String lastName, int age, String address, String phone){
    setId(contactid)
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
    this.address = address;
    this.phone= phone;
}}

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

CampaignDAO dao = CampaignDAO.find(CampaignDAO.class, NamingHelper.toSQLNameDefault("isPersonal") + " = ? ", "1").get(0);

Добавление конструктора по умолчанию должно решить эту проблему:

public class User 
{
    public User() {
    }
    ..
}
Другие вопросы по тегам