2017-01-12 6 views
1

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

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; 

    } 


} 

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

<?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);

, но ни один из них не работал для меня.

Directory structure of my project

+0

Причина в том, что в базе данных нет таблицы с именем ** CONTACT **. Вам также сообщается, что ошибка произошла при компиляции инструкции SELECT. Если у вас есть жесткий код ** CONTACT ** в любом месте, то, возможно, это должно быть ** Контакт ** (имена таблиц чувствительны к регистру, как имена столбцов). Я предполагаю, что выбор является частью проверки того, что контакт (по id) еще не существует. – MikeT

ответ

1

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

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

Как вы обновили свой вопрос, ваши пакеты выглядят хорошо. Проблема заключается в том, что вы добавили contactid в свой пакет, который определяется как настраиваемое поле для сахара 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); 
+0

Я добавил скриншот структуры каталогов моего приложения, я думаю, что пакет правильный или мне нужно указать имя класса? –

+0

После внесения изменений в POJO, как было предложено вами, я все равно получаю ту же ошибку. 'android.database.sqlite.SQLiteException: нет такой таблицы: CONTACT (код 1): при компиляции: ВСТАВИТЬ ИЛИ ЗАМЕНИТЬ В КОНТАКТ (ID, FIRST_NAME, ВОЗРАСТ, АДРЕС, LAST_NAME, PHONE) ЗНАЧЕНИЯ (?,?,?, ?,?,?) ' –

+0

Можете ли вы попытаться сделать чистую установку? (Unistall и установите его agian.) Похоже, у вас есть база данных версии 2, но didint suplied запросы перенастройки. Вы можете добавить контакт SugarRecord позже? –

0

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

public class User 
{ 
    public User() { 
    } 
    .. 
} 
2

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

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

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

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

+0

Лучший ответ! –

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

  • Нет связанных вопросов^_^