Приложение аварийно завершает работу при использовании предварительно заполненной базы данных номеров. ⇐ Android
Приложение аварийно завершает работу при использовании предварительно заполненной базы данных номеров.
Я пытаюсь использовать предварительно заполненную базу данных Room, но при попытке использовать базу данных происходит сбой со следующей ошибкой: java.lang.NullPointerException: курсор.getString(toColumnIndex) не должен иметь значение null
Все работает нормально, пока я не добавляю метод createFromAsset("databses/test.db"), когда он выходит из строя. Ничего не выйдет из строя, если я просто не выполню метод getAllCocktails(). Я уже проверил, имеет ли вставленная мной БД все то же самое, и не смог найти никаких различий (я также проверил загрузку данных с помощью AppInspection)
Я не только тестировал с помощью getAllCocktails(), я также пробовал вставлять с помощью полностью параметризованного конструктора
Я опубликую (часть) своего кода и журналов, чтобы было легче диагностировать Я пробовал использовать версии Room 2.5.1 и 2.5.2
файл test.db
Действие:
публичный класс PedirTragoActivity расширяет AppCompatActivity { База данных приложений; @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_pedir_trago1_1); db = AppDatabase.getInstance(this.getApplication()); db.cocktailDAO().getAllCocktails(); } } База данных комнат:
@Database(entities = { BottleEntity.класс, BottleIngredientEntity.класс, CocktailEntity.класс, CocktailIngredientEntity.класс, IngredientTypeEntity.class }, версия = 7) публичный абстрактный класс AppDatabase расширяет RoomDatabase { общедоступная статическая база данных AppDatabase INSTANCE; общедоступная абстракция BottleDAO BottleDAO(); общедоступная абстракция BottleIngredientDAO BottleIngredientDAO(); публичный абстрактный CocktailDAO CocktailDAO(); публичный абстрактный CocktailIngredientDAO CocktailIngredientDAO(); публичный абстрактный IngredientTypeDAO IngredientTypeDAO(); public static AppDatabase getInstance (контекст контекста) { если (ЭКЗЕМПЛЯР == ноль) { ЭКЗЕМПЛЯР = Room.databaseBuilder(контекст, AppDatabase.class, "barbotApp.db") .allowMainThreadQueries() .fallbackToDestructiveMigration() .createFromAsset("базы данных/test.db") .строить(); } вернуть ЭКЗЕМПЛЯР; } } BottleEntity:
@Entity(tableName = "bottles") общественный класс BottleEntity { @Основной ключ @NonNull частная внутренняя позиция;//Del 0 al 7 son Alcoholes, el 8 es шейкер y del 9 al 16 son mezclas частное имя строки; @NonNull частная внутренняя емкость; @NonNull частный int currentAmount; общественный BottleEntity() { } public BottleEntity (intposition, String name, int емкость, int currentAmount) { this.position = позиция; это.имя = имя; this.capacity = емкость; this.currentAmount = текущая сумма; } @Игнорировать public BottleEntity (int Position, String name, int емкость) { this.position = позиция; это.имя = имя; this.capacity = емкость; this.currentAmount = емкость; } общественный ИНТ getPosition () { возвратное положение; } общественный недействительный setPosition (int позиция) { this.position = позиция; } публичная строка getName() { вернуть имя; } public void setName (имя строки) { это.имя = имя; } public int getCapacity() { возвратная емкость; } общественный недействительный setCapacity (int емкость) { this.capacity = емкость; } общественный ИНТ getCurrentAmount () { вернуть текущую сумму; } общественная недействительность setCurrentAmount (int currentAmount) { this.currentAmount = текущая сумма; } } BottleIngredientEntity:
@Entity(tableName = "bottle_ingredient", ForeignKeys = { @ForeignKey(entity = BottleEntity.class, ParentColumns = «позиция», childColumns = «bottlePos»), @ForeignKey(entity = IngredientTypeEntity.class,parentColumns = «id», childColumns = «ingredientId») }) общественный класс BottleIngredientEntity { @PrimaryKey(autoGenerate = true) @NonNull частный внутренний идентификатор; @NonNull частный int BottlePos; @NonNull частный int ингредиентId; общественный BottleIngredientEntity () { } public BottleIngredientEntity(int BottlePos, int идентификатор ингредиента) { this.bottlePos = BottlePos; this.ingredientId = идентификатор ингредиента; } общественный int getId() { вернуть идентификатор; } общественный недействительный setId (int id) { this.id = идентификатор; } public int getBottlePos() { возврат бутылкиPos; } public void setBottlePos(int BottlePos) { this.bottlePos = BottlePos; } public int getIngredientId() { вернуть идентификатор ингредиента; } общественный недействительный setIngredientId (INT IngredientId) { this.ingredientId = идентификатор ингредиента; } } CocktailIngredientEntity:
@Entity(tableName = "cocktail_ingredients", ForeignKeys = { @ForeignKey(entity = IngredientTypeEntity.class,parentColumns = "id", childColumns = "typeId"), @ForeignKey(entity = CocktailEntity.class,parentColumns = «id», childColumns = «cocktailId») }) общественный класс CocktailIngredientEntity { @PrimaryKey(autoGenerate = true) @NonNull частный внутренний идентификатор; @NonNull частный int typeId; @NonNull частное количество int; @NonNull частный int CocktailId; public CocktailIngredientEntity (int typeId, int количество, int CocktailId) { this.typeId = typeId; это.количество = количество; this.cocktailId = CocktailId; } общественный int getId() { вернуть идентификатор; } общественный недействительный setId (int id) { this.id = идентификатор; } общественный int getTypeId() { вернуть идентификатор типа; } общественный недействительный setTypeId (int typeId) { this.typeId = typeId; } общественный ИНТ getQuantity () { количество возврата; } public void setQuantity (количество int) { это.количество = количество; } public int getCocktailId() { вернуть идентификатор коктейля; } public void setCocktailId(int CocktailId) { this.cocktailId = CocktailId; } } IngredientTypeEntity:
@Entity(tableName = "ingredient_types") общественный класс IngredientTypeEntity { @PrimaryKey(autoGenerate = true) @NonNull частный внутренний идентификатор; частное имя строки; общественный IngredientTypeEntity () { } public IngredientTypeEntity (имя строки) { это.имя = имя; } общественный int getId() { вернуть идентификатор; } общественный недействительный setId (int id) { this.id = идентификатор; } публичная строка getName() { вернуть имя; } public void setName (имя строки) { это.имя = имя; } } CocktailEntity:
@Entity(tableName = "коктейли") общественный класс CocktailEntity { @PrimaryKey(autoGenerate = true) @NonNull частный внутренний идентификатор; частное имя строки; @NonNull частное логическое значение isOnStock; @NonNull частное логическое значение hasIce; частная строка imgName; public CocktailEntity (имя строки, логическое значение isOnStock, логическое значение hasIce, строка imgName) { это.имя = имя; this.isOnStock = isOnStock; this.hasIce = hasIce; this.imgName = imgName; } @Игнорировать public CocktailEntity (имя строки, логическое значение hasIce, строка imaName) { это.имя = имя; this.isOnStock = ложь; this.hasIce = hasIce; } общественный int getId() { вернуть идентификатор; } общественный недействительный setId (int id) { this.id = идентификатор; } публичная строка getName() { вернуть имя; } public void setName (имя строки) { это.имя = имя; } общедоступное логическое значение isOnStock() { вернуть isOnStock; } public void setOnStock(boolean onStock) { isOnStock = onStock; } общедоступное логическое значение isHasIce() { вернуть hasIce; } public void setHasIce(boolean hasIce) { this.hasIce = hasIce; } публичная строка getImgName() { вернуть имя_изображения; } public void setImgName (String imgName) { this.imgName = imgName; } } КоктейльДао:
@Dao общедоступный интерфейс CocktailDAO { @Вставлять длинная вставкаCocktail (коктейль CocktailEntity); @Query("ВЫБРАТЬ идентификатор ИЗ коктейлей WHERE name =:name") int getCocktailId (имя строки); @Query("ВЫБРАТЬ c.* FROM коктейли AS c WHERE c.id = :id") CocktailEntity getCocktail (int id); //Нужно использовать репозиторий, разделите эти две части @Query("ВЫБРАТЬ * ИЗ коктейлей") List getAllCocktails(); @Query("ВЫБРАТЬ Cocktails.id ИЗ коктейлей") List getAllCocktailIds(); @Query("ВЫБРАТЬ * ИЗ коктейлей" + "ГДЕ коктейли.isOnStock = 1") Список getAllCocktailsInStock(); @Query("ВЫБРАТЬ isOnStock ИЗ коктейлей WHERE id = :id") логическое значение isCocktailInStock(int id); @Query("ОБНОВЛЕНИЕ коктейлей SET isOnStock = :isOnStock WHERE id = :id") void updateCocktailStock (int id, логическое значение isOnStock); } Логическая котировка:
2023-09-23 17:17:20.600 8250-8250 Хореограф com.mecatronica.barbot Я Пропустил 67 кадров! Возможно, приложение выполняет слишком много работы в своем основном потоке. 2023-09-23 17:17:20.801 8250-8594 AdrenoGLES-0 com.mecatronica.barbot I сборка QUALCOMM: 03e27f8, I326e6aff90 Дата сборки: 02.11.20 Версия компилятора шейдеров OpenGL ES: EV031.32.02.04 Местный филиал: mybrancheb1d781c-1a78-f1f4-8c78-ac1f6bcc2cee Удаленная ветвь: quic/gfx-adreno.lnx.1.0.r116-rel Удаленный филиал: НЕТ Реконструировать ветку: НИЧЕГО 2023-09-23 17:17:20.801 8250-8594 AdrenoGLES-0 com.mecatronica.barbot Я собираю конфигурацию: SP 10.0.7 AArch64 2023-09-23 17:17:20.801 8250-8594 AdrenoGLES-0 com.mecatronica.barbot I Путь к драйверу: /vendor/lib64/egl/libGLESv2_adreno.so 2023-09-23 17:17:20.813 8250-8594 AdrenoGLES-0 com.mecatronica.barbot I PFP: 0x016ee190, ME: 0x00000000 2023-09-23 17:17:21.019 8250-8594 LB com.mecatronica.barbot E не удается открыть файл: такого файла или каталога нет. 2023-09-23 17:17:21.021 8250-8594 OpenGLRenderer com.mecatronica.barbot Я, Дэйви! продолжительность=1547 мс; Флаги = 1, IntendedVsync = 42335033169415, Vsync = 42336149836037, OldestInputEvent = 9223372036854775807, NewestInputEvent = 0, HandleInputStart = 42336161943432, AnimationStart = 42336162004370 , PerformTraversalsStart=42336162065047, DrawStart=42336409293120, SyncQueued=42336445054213, SyncStart=42336445465515, IssueDrawCommandsStart=42336445624838, SwapBuffers= 42336577074578, FrameCompleted=42336581385203, DequeueBufferDuration=272760, QueueBufferDuration=682187, GpuCompleted=1893829464, 2023-09-23 17:17:21.027 8250-8250 Looper com.mecatronica.barbot W PerfMonitor doFrame: время = 424 мс vsyncFrame = 0 задержка = 1127 мс procState = 2 HistoryMsgCount = 10 (msgIndex = 1 wall = 1223 мс seq = 4 работает = 1128 мс работает = 12 мс поздно = 2999 мс h = android.app.ActivityThread$H w = 159) (msgIndex = 5 wall = 1007 мс seq = 8 работает = 2 мс работает = 1 мс io = 4 мс поздно = 3591 мс h = android.app.ActivityThread$ Ч ш=127) 2023-09-23 17:17:21.154 8250-8250 Looper com.mecatronica.barbot W PerfMonitor doFrame: время = 35 мс vsyncFrame = 0 задержка = 459 мс procState = 2 HistoryMsgCount = 4 (msgIndex = 1 wall = 424 мс seq = 14 работает = 255 мс runnable=1 мс с опозданием=1127 мс h=android.view.Choreographer$FrameHandler c=android.view.Choreographer$FrameDisplayEventReceiver) (msgIndex=4 wall=78ms seq=17 Running=70ms runnable=2ms late=413ms h=android.view .ViewRootImpl$ViewRootHandler c=androidx.appcompat.app.AppCompatDelegateImpl$2) 2023-09-23 17:17:28.708 8250-8250 MiuiFrameworkFactory com.mecatronica.barbot V получить объект AllImpl = android.common.MiuiFrameworkFactoryImpl@b038154 2023-09-23 17:17:28.726 8250-8250 MirrorManager com.mecatronica.barbot W эта модель не поддерживает 2023-09-23 17:17:28.773 8250-8250 Хронология com.mecatronica.barbot I Хронология: Activity_launch_request time: 42344334 2023-09-23 17:17:28.996 8250-8250 DecorView[] com.mecatronica.barbot D getWindowModeFromSystem оконный режим равен 1 2023-09-23 17:17:28.997 8250-8250 DecorView com.mecatronica.barbot D createDecorCaptionView windowingMode:1 mWindowMode 1 isFullscreen: true 2023-09-23 17:17:30.631 8250-8250 AndroidRuntime com.mecatronica.barbot D Завершение работы виртуальной машины 2023-09-23 17:17:30.646 8250-8250 AndroidRuntime com.mecatronica.barbot E ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основное Процесс: com.mecatronica.barbot, PID: 8250 java.lang.RuntimeException: невозможно начать действие ComponentInfo{com.mecatronica.barbot/com.mecatronica.barbot.PedirTragoActivity}: java.lang.NullPointerException: курсор.getString(toColumnIndex) не должен иметь значение null в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3550) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3710) в android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) в android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) в android.app.ActivityThread$H.handleMessage(ActivityThread.java:2146) в android.os.Handler.dispatchMessage(Handler.java:106) в android.os.Looper.loop(Looper.java:236) в android.app.ActivityThread.main(ActivityThread.java:8057) в java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) Вызвано: java.lang.NullPointerException: курсор.getString(toColumnIndex) м в с т н О т б Это н в л л а т а н д р О я д Икс . р О О м . в т я л . Т а б л Это я н ж О К т . р Это а д Ф О р Это я г н К Это и Ф я Это л д М а п п я н г с ( Т а б л Это я н ж О . к т : 5 3 6 ) а т а н д р О я д Икс . р О О м . в т я л . Т а б л Это я н ж О К т . р Это а д Ф О р Это я г н К Это и с ( Т а б л Это я н ж О . к т : 4 8 8 ) а т а н д р О я д Икс . р О О м . в т я л . Т а б л Это я н ж О К т . р Это а д Т а б л Это я н ж О ( Т а б л Это я н ж О . к т : 4 7 2 ) а т а н д р О я д Икс . р О О м . в т я л . Т а б л Это я н ж О $ С О м п а н я О н . р Это а д ( Т а б л Это я н ж О . к т : 1 3 0 ) а т а н д р О я д Икс . р О О м . в т я л . Т а б л Это я н ж О . р Это а д ( В н к н О В н С О в р с Это : 2 ) а т с О м . м Это с а т р О н я с а . б а р б О т . д а т а б а с Это . А п п Д а т а б а с Это _ я м п л $ 1 . О н В а л я д а т Это С с час Это м а ( А п п Д а т а б а с Это _ я м п л . дж а в а : 1 3 6 ) а т а н д р О я д Икс . р О О м . р О О м О п Это н ЧАС Это л п Это р . О н С р Это а т Это ( р О О м О п Это н ЧАС Это л п Это р . к т : 7 2 ) а т а н д р О я д Икс . с д л я т Это . д б . ж р а м Это В О р к . Ф р а м Это В О р к С вопрос л я т Это О п Это н ЧАС Это л п Это р $ О п Это н ЧАС Это л п Это р . О н С р Это а т Это ( Ф р а м Это В orkSQLiteOpenHelper.kt:244) в android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:411) в android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:316) в androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableOrReadableDatabase(FrameworkSQLiteOpenHelper.kt:232) в androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.innerGetDatabase(FrameworkSQLiteOpenHelper.kt:190) в androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getSupportDatabase(FrameworkSQLiteOpenHelper.kt:151) в androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.kt:104) в androidx.room.SQLiteCopyOpenHelper.getWritableDatabase(SQLiteCopyOpenHelper.kt:71) в androidx.room.RoomDatabase.inTransaction(RoomDatabase.kt:638) в androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.kt:457) на com.mecatronica.barbot.database.daos.CocktailDAO_Impl.getAllCocktails(CocktailDAO_Impl.java:177) на com.mecatronica.barbot.PedirTragoActivity.onCreate(PedirTragoActivity.java:63) в android.app.Activity.performCreate(Activity.java:8157) в android.app.Activity.performCreate(Activity.java:8129) в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310) в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3523) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3710) в android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) в android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) в android.app.ActivityThread$H.handleMessage(ActivityThread.java:2146) в android.os.Handler.dispatchMessage(Handler.java:106) в android.os.Looper.loop(Looper.java:236) в android.app.ActivityThread.main(ActivityThread.java:8057) в java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) 2023-09-23 17:17:30.716 8250-8250 Процесс com.mecatronica.barbot I Отправка сигнала. ПИД: 8250 СИГНАЛ: 9 Форма дампа sql test.db:
PRAGMA Foreign_keys=OFF; НАЧАТЬ ТРАНЗАКЦИЮ; СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ "ingredient_types" ( идентификатор INTEGER не равен нулю ограничение ингредиент_типы_пк основной ключ, имя ТЕКСТ ); INSERT INTO Inding_types VALUES(1,'SHAKE'); INSERT INTO Inding_types VALUES(2,'лимон'); INSERT INTO Inding_types VALUES(3,'ron'); INSERT INTO Inding_types VALUES(4,'тоника'); INSERT INTO Inding_types VALUES(5,'ginebra'); INSERT INTO Inding_types VALUES(6,'Campari'); INSERT INTO Inding_types VALUES(7,'naranja'); INSERT INTO Inding_types VALUES(8,'fernet'); INSERT INTO Inding_types VALUES(9,'кока'); INSERT INTO Inding_types VALUES(10,'durazno'); INSERT INTO Inding_types VALUES(11,'гранадина'); INSERT INTO Inding_types VALUES(12,'водка'); СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ "bottle_ingredient" ( идентификатор INTEGER не равен нулю ограничение Bottle_ingredient_pk основной ключ, BottlePos INTEGER не равен нулю ограничение Bottle_ingredient_bottles_position_fk референсные бутылки, идентификатор ингредиента INTEGER не равен нулю ограничение Bottle_ingredient_ingredient_types_id_fk ссылки на типы ингредиентов ); INSERT INTO Bottle_ingredient VALUES(1,8,5); INSERT INTO Bottle_ingredient VALUES(2,9,6); INSERT INTO Bottle_ingredient VALUES(3,10,8); INSERT INTO Bottle_ingredient VALUES(4,11,3); INSERT INTO Bottle_ingredient VALUES(5,12,12); INSERT INTO Bottle_ingredient VALUES(7,0,2); INSERT INTO Bottle_ingredient VALUES(8,1,4); INSERT INTO Bottle_ingredient VALUES(9,2,7); INSERT INTO Bottle_ingredient VALUES(10,3,9); INSERT INTO Bottle_ingredient VALUES(11,4,10); INSERT INTO Bottle_ingredient VALUES(12,5,11); INSERT INTO Bottle_ingredient VALUES(13,16,1); СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ «бутылок» ( позиция INTEGER не равна нулю ограничение бутылки_pk основной ключ, имя ТЕКСТ, емкость INTEGER не равна нулю, currentAmount INTEGER не равен нулю ); INSERT INTO Bottles VALUES(0,'limon',2000,2000); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(1,'тоника',2000,2000); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(2,'naranja',2000,2000); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ (3, «кока», 2000, 2000); INSERT INTO Bottles VALUES(4,'durazno',2000,2000); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(5,'гранадина',2000,2000); INSERT INTO Bottles VALUES(6,'Mezcla 7',1,1); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(7,'Mezcla 8',1,1); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(8,'ginebra',700,700); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ (9, «кампари», 750 750); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(10,'fernet',750,750); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(11,'ron',750,750); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ (12, «водка», 700 700); INSERT INTO Bottles VALUES(13,'Bottle 6',1,1); INSERT INTO Bottles VALUES(14,'Bottle 7',1,1); INSERT INTO Bottles VALUES(15,'Бутылка 8',1,1); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ (16, «Шейкео», 1000,1000); СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ "cocktail_ingredients" ( идентификатор INTEGER не равен нулю ограничение Cocktail_ingredients_pk основной ключ, typeId INTEGER не равен нулю ограничение коктейль_ingredient_ingredient_types_id_fk ссылки на ингредиенты_типы, количество INTEGER не равно нулю, CocktailId INTEGER не равен нулю ограничение Cocktail_ingredients_cocktails_id_fk ссылки на коктейли ); INSERT INTO Cocktail_ingredients VALUES(1,6,60,1); INSERT INTO Cocktail_ingredients VALUES(2,7,136,1); INSERT INTO Cocktail_ingredients VALUES(3,9,146,2); INSERT INTO Cocktail_ingredients VALUES(4,8,50,2); INSERT INTO Cocktail_ingredients VALUES(5,5,60,3); INSERT INTO Cocktail_ingredients VALUES(6,4,136,3); INSERT INTO Cocktail_ingredients VALUES(7,3,50,4); INSERT INTO Cocktail_ingredients VALUES(8,9,120,4); INSERT INTO Cocktail_ingredients VALUES(9,2,10,4); INSERT INTO Cocktail_ingredients VALUES(10,12,40,5); INSERT INTO Cocktail_ingredients VALUES(11,10,20,5); INSERT INTO Cocktail_ingredients VALUES(12,7,40,5); INSERT INTO Cocktail_ingredients VALUES(13,1,30,5); INSERT INTO Cocktail_ingredients VALUES(14,11,40,5); СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ «коктейли» ( идентификатор INTEGER не равен нулю ограничение коктейлей_pk основной ключ, имя ТЕКСТ, isOnStock INTEGER не равен нулю, hasIce INTEGER не равен нулю, imgName ТЕКСТ ); INSERT INTO коктейли VALUES(1,'Campari',1,1,'Campari'); INSERT INTO коктейли VALUES(2,'fernet',1,1,'fernet'); INSERT INTO коктейли VALUES(3,'джин тоник',1,1,'гинтоник'); INSERT INTO коктейли VALUES(4,'ron cola',1,1,'roncola'); INSERT INTO коктейли VALUES(5,'sex On the Beach',1,1,'sexOnTheBeach'); СОВЕРШИТЬ;
Я пытаюсь использовать предварительно заполненную базу данных Room, но при попытке использовать базу данных происходит сбой со следующей ошибкой: java.lang.NullPointerException: курсор.getString(toColumnIndex) не должен иметь значение null
Все работает нормально, пока я не добавляю метод createFromAsset("databses/test.db"), когда он выходит из строя. Ничего не выйдет из строя, если я просто не выполню метод getAllCocktails(). Я уже проверил, имеет ли вставленная мной БД все то же самое, и не смог найти никаких различий (я также проверил загрузку данных с помощью AppInspection)
Я не только тестировал с помощью getAllCocktails(), я также пробовал вставлять с помощью полностью параметризованного конструктора
Я опубликую (часть) своего кода и журналов, чтобы было легче диагностировать Я пробовал использовать версии Room 2.5.1 и 2.5.2
файл test.db
Действие:
публичный класс PedirTragoActivity расширяет AppCompatActivity { База данных приложений; @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_pedir_trago1_1); db = AppDatabase.getInstance(this.getApplication()); db.cocktailDAO().getAllCocktails(); } } База данных комнат:
@Database(entities = { BottleEntity.класс, BottleIngredientEntity.класс, CocktailEntity.класс, CocktailIngredientEntity.класс, IngredientTypeEntity.class }, версия = 7) публичный абстрактный класс AppDatabase расширяет RoomDatabase { общедоступная статическая база данных AppDatabase INSTANCE; общедоступная абстракция BottleDAO BottleDAO(); общедоступная абстракция BottleIngredientDAO BottleIngredientDAO(); публичный абстрактный CocktailDAO CocktailDAO(); публичный абстрактный CocktailIngredientDAO CocktailIngredientDAO(); публичный абстрактный IngredientTypeDAO IngredientTypeDAO(); public static AppDatabase getInstance (контекст контекста) { если (ЭКЗЕМПЛЯР == ноль) { ЭКЗЕМПЛЯР = Room.databaseBuilder(контекст, AppDatabase.class, "barbotApp.db") .allowMainThreadQueries() .fallbackToDestructiveMigration() .createFromAsset("базы данных/test.db") .строить(); } вернуть ЭКЗЕМПЛЯР; } } BottleEntity:
@Entity(tableName = "bottles") общественный класс BottleEntity { @Основной ключ @NonNull частная внутренняя позиция;//Del 0 al 7 son Alcoholes, el 8 es шейкер y del 9 al 16 son mezclas частное имя строки; @NonNull частная внутренняя емкость; @NonNull частный int currentAmount; общественный BottleEntity() { } public BottleEntity (intposition, String name, int емкость, int currentAmount) { this.position = позиция; это.имя = имя; this.capacity = емкость; this.currentAmount = текущая сумма; } @Игнорировать public BottleEntity (int Position, String name, int емкость) { this.position = позиция; это.имя = имя; this.capacity = емкость; this.currentAmount = емкость; } общественный ИНТ getPosition () { возвратное положение; } общественный недействительный setPosition (int позиция) { this.position = позиция; } публичная строка getName() { вернуть имя; } public void setName (имя строки) { это.имя = имя; } public int getCapacity() { возвратная емкость; } общественный недействительный setCapacity (int емкость) { this.capacity = емкость; } общественный ИНТ getCurrentAmount () { вернуть текущую сумму; } общественная недействительность setCurrentAmount (int currentAmount) { this.currentAmount = текущая сумма; } } BottleIngredientEntity:
@Entity(tableName = "bottle_ingredient", ForeignKeys = { @ForeignKey(entity = BottleEntity.class, ParentColumns = «позиция», childColumns = «bottlePos»), @ForeignKey(entity = IngredientTypeEntity.class,parentColumns = «id», childColumns = «ingredientId») }) общественный класс BottleIngredientEntity { @PrimaryKey(autoGenerate = true) @NonNull частный внутренний идентификатор; @NonNull частный int BottlePos; @NonNull частный int ингредиентId; общественный BottleIngredientEntity () { } public BottleIngredientEntity(int BottlePos, int идентификатор ингредиента) { this.bottlePos = BottlePos; this.ingredientId = идентификатор ингредиента; } общественный int getId() { вернуть идентификатор; } общественный недействительный setId (int id) { this.id = идентификатор; } public int getBottlePos() { возврат бутылкиPos; } public void setBottlePos(int BottlePos) { this.bottlePos = BottlePos; } public int getIngredientId() { вернуть идентификатор ингредиента; } общественный недействительный setIngredientId (INT IngredientId) { this.ingredientId = идентификатор ингредиента; } } CocktailIngredientEntity:
@Entity(tableName = "cocktail_ingredients", ForeignKeys = { @ForeignKey(entity = IngredientTypeEntity.class,parentColumns = "id", childColumns = "typeId"), @ForeignKey(entity = CocktailEntity.class,parentColumns = «id», childColumns = «cocktailId») }) общественный класс CocktailIngredientEntity { @PrimaryKey(autoGenerate = true) @NonNull частный внутренний идентификатор; @NonNull частный int typeId; @NonNull частное количество int; @NonNull частный int CocktailId; public CocktailIngredientEntity (int typeId, int количество, int CocktailId) { this.typeId = typeId; это.количество = количество; this.cocktailId = CocktailId; } общественный int getId() { вернуть идентификатор; } общественный недействительный setId (int id) { this.id = идентификатор; } общественный int getTypeId() { вернуть идентификатор типа; } общественный недействительный setTypeId (int typeId) { this.typeId = typeId; } общественный ИНТ getQuantity () { количество возврата; } public void setQuantity (количество int) { это.количество = количество; } public int getCocktailId() { вернуть идентификатор коктейля; } public void setCocktailId(int CocktailId) { this.cocktailId = CocktailId; } } IngredientTypeEntity:
@Entity(tableName = "ingredient_types") общественный класс IngredientTypeEntity { @PrimaryKey(autoGenerate = true) @NonNull частный внутренний идентификатор; частное имя строки; общественный IngredientTypeEntity () { } public IngredientTypeEntity (имя строки) { это.имя = имя; } общественный int getId() { вернуть идентификатор; } общественный недействительный setId (int id) { this.id = идентификатор; } публичная строка getName() { вернуть имя; } public void setName (имя строки) { это.имя = имя; } } CocktailEntity:
@Entity(tableName = "коктейли") общественный класс CocktailEntity { @PrimaryKey(autoGenerate = true) @NonNull частный внутренний идентификатор; частное имя строки; @NonNull частное логическое значение isOnStock; @NonNull частное логическое значение hasIce; частная строка imgName; public CocktailEntity (имя строки, логическое значение isOnStock, логическое значение hasIce, строка imgName) { это.имя = имя; this.isOnStock = isOnStock; this.hasIce = hasIce; this.imgName = imgName; } @Игнорировать public CocktailEntity (имя строки, логическое значение hasIce, строка imaName) { это.имя = имя; this.isOnStock = ложь; this.hasIce = hasIce; } общественный int getId() { вернуть идентификатор; } общественный недействительный setId (int id) { this.id = идентификатор; } публичная строка getName() { вернуть имя; } public void setName (имя строки) { это.имя = имя; } общедоступное логическое значение isOnStock() { вернуть isOnStock; } public void setOnStock(boolean onStock) { isOnStock = onStock; } общедоступное логическое значение isHasIce() { вернуть hasIce; } public void setHasIce(boolean hasIce) { this.hasIce = hasIce; } публичная строка getImgName() { вернуть имя_изображения; } public void setImgName (String imgName) { this.imgName = imgName; } } КоктейльДао:
@Dao общедоступный интерфейс CocktailDAO { @Вставлять длинная вставкаCocktail (коктейль CocktailEntity); @Query("ВЫБРАТЬ идентификатор ИЗ коктейлей WHERE name =:name") int getCocktailId (имя строки); @Query("ВЫБРАТЬ c.* FROM коктейли AS c WHERE c.id = :id") CocktailEntity getCocktail (int id); //Нужно использовать репозиторий, разделите эти две части @Query("ВЫБРАТЬ * ИЗ коктейлей") List getAllCocktails(); @Query("ВЫБРАТЬ Cocktails.id ИЗ коктейлей") List getAllCocktailIds(); @Query("ВЫБРАТЬ * ИЗ коктейлей" + "ГДЕ коктейли.isOnStock = 1") Список getAllCocktailsInStock(); @Query("ВЫБРАТЬ isOnStock ИЗ коктейлей WHERE id = :id") логическое значение isCocktailInStock(int id); @Query("ОБНОВЛЕНИЕ коктейлей SET isOnStock = :isOnStock WHERE id = :id") void updateCocktailStock (int id, логическое значение isOnStock); } Логическая котировка:
2023-09-23 17:17:20.600 8250-8250 Хореограф com.mecatronica.barbot Я Пропустил 67 кадров! Возможно, приложение выполняет слишком много работы в своем основном потоке. 2023-09-23 17:17:20.801 8250-8594 AdrenoGLES-0 com.mecatronica.barbot I сборка QUALCOMM: 03e27f8, I326e6aff90 Дата сборки: 02.11.20 Версия компилятора шейдеров OpenGL ES: EV031.32.02.04 Местный филиал: mybrancheb1d781c-1a78-f1f4-8c78-ac1f6bcc2cee Удаленная ветвь: quic/gfx-adreno.lnx.1.0.r116-rel Удаленный филиал: НЕТ Реконструировать ветку: НИЧЕГО 2023-09-23 17:17:20.801 8250-8594 AdrenoGLES-0 com.mecatronica.barbot Я собираю конфигурацию: SP 10.0.7 AArch64 2023-09-23 17:17:20.801 8250-8594 AdrenoGLES-0 com.mecatronica.barbot I Путь к драйверу: /vendor/lib64/egl/libGLESv2_adreno.so 2023-09-23 17:17:20.813 8250-8594 AdrenoGLES-0 com.mecatronica.barbot I PFP: 0x016ee190, ME: 0x00000000 2023-09-23 17:17:21.019 8250-8594 LB com.mecatronica.barbot E не удается открыть файл: такого файла или каталога нет. 2023-09-23 17:17:21.021 8250-8594 OpenGLRenderer com.mecatronica.barbot Я, Дэйви! продолжительность=1547 мс; Флаги = 1, IntendedVsync = 42335033169415, Vsync = 42336149836037, OldestInputEvent = 9223372036854775807, NewestInputEvent = 0, HandleInputStart = 42336161943432, AnimationStart = 42336162004370 , PerformTraversalsStart=42336162065047, DrawStart=42336409293120, SyncQueued=42336445054213, SyncStart=42336445465515, IssueDrawCommandsStart=42336445624838, SwapBuffers= 42336577074578, FrameCompleted=42336581385203, DequeueBufferDuration=272760, QueueBufferDuration=682187, GpuCompleted=1893829464, 2023-09-23 17:17:21.027 8250-8250 Looper com.mecatronica.barbot W PerfMonitor doFrame: время = 424 мс vsyncFrame = 0 задержка = 1127 мс procState = 2 HistoryMsgCount = 10 (msgIndex = 1 wall = 1223 мс seq = 4 работает = 1128 мс работает = 12 мс поздно = 2999 мс h = android.app.ActivityThread$H w = 159) (msgIndex = 5 wall = 1007 мс seq = 8 работает = 2 мс работает = 1 мс io = 4 мс поздно = 3591 мс h = android.app.ActivityThread$ Ч ш=127) 2023-09-23 17:17:21.154 8250-8250 Looper com.mecatronica.barbot W PerfMonitor doFrame: время = 35 мс vsyncFrame = 0 задержка = 459 мс procState = 2 HistoryMsgCount = 4 (msgIndex = 1 wall = 424 мс seq = 14 работает = 255 мс runnable=1 мс с опозданием=1127 мс h=android.view.Choreographer$FrameHandler c=android.view.Choreographer$FrameDisplayEventReceiver) (msgIndex=4 wall=78ms seq=17 Running=70ms runnable=2ms late=413ms h=android.view .ViewRootImpl$ViewRootHandler c=androidx.appcompat.app.AppCompatDelegateImpl$2) 2023-09-23 17:17:28.708 8250-8250 MiuiFrameworkFactory com.mecatronica.barbot V получить объект AllImpl = android.common.MiuiFrameworkFactoryImpl@b038154 2023-09-23 17:17:28.726 8250-8250 MirrorManager com.mecatronica.barbot W эта модель не поддерживает 2023-09-23 17:17:28.773 8250-8250 Хронология com.mecatronica.barbot I Хронология: Activity_launch_request time: 42344334 2023-09-23 17:17:28.996 8250-8250 DecorView[] com.mecatronica.barbot D getWindowModeFromSystem оконный режим равен 1 2023-09-23 17:17:28.997 8250-8250 DecorView com.mecatronica.barbot D createDecorCaptionView windowingMode:1 mWindowMode 1 isFullscreen: true 2023-09-23 17:17:30.631 8250-8250 AndroidRuntime com.mecatronica.barbot D Завершение работы виртуальной машины 2023-09-23 17:17:30.646 8250-8250 AndroidRuntime com.mecatronica.barbot E ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основное Процесс: com.mecatronica.barbot, PID: 8250 java.lang.RuntimeException: невозможно начать действие ComponentInfo{com.mecatronica.barbot/com.mecatronica.barbot.PedirTragoActivity}: java.lang.NullPointerException: курсор.getString(toColumnIndex) не должен иметь значение null в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3550) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3710) в android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) в android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) в android.app.ActivityThread$H.handleMessage(ActivityThread.java:2146) в android.os.Handler.dispatchMessage(Handler.java:106) в android.os.Looper.loop(Looper.java:236) в android.app.ActivityThread.main(ActivityThread.java:8057) в java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) Вызвано: java.lang.NullPointerException: курсор.getString(toColumnIndex) м в с т н О т б Это н в л л а т а н д р О я д Икс . р О О м . в т я л . Т а б л Это я н ж О К т . р Это а д Ф О р Это я г н К Это и Ф я Это л д М а п п я н г с ( Т а б л Это я н ж О . к т : 5 3 6 ) а т а н д р О я д Икс . р О О м . в т я л . Т а б л Это я н ж О К т . р Это а д Ф О р Это я г н К Это и с ( Т а б л Это я н ж О . к т : 4 8 8 ) а т а н д р О я д Икс . р О О м . в т я л . Т а б л Это я н ж О К т . р Это а д Т а б л Это я н ж О ( Т а б л Это я н ж О . к т : 4 7 2 ) а т а н д р О я д Икс . р О О м . в т я л . Т а б л Это я н ж О $ С О м п а н я О н . р Это а д ( Т а б л Это я н ж О . к т : 1 3 0 ) а т а н д р О я д Икс . р О О м . в т я л . Т а б л Это я н ж О . р Это а д ( В н к н О В н С О в р с Это : 2 ) а т с О м . м Это с а т р О н я с а . б а р б О т . д а т а б а с Это . А п п Д а т а б а с Это _ я м п л $ 1 . О н В а л я д а т Это С с час Это м а ( А п п Д а т а б а с Это _ я м п л . дж а в а : 1 3 6 ) а т а н д р О я д Икс . р О О м . р О О м О п Это н ЧАС Это л п Это р . О н С р Это а т Это ( р О О м О п Это н ЧАС Это л п Это р . к т : 7 2 ) а т а н д р О я д Икс . с д л я т Это . д б . ж р а м Это В О р к . Ф р а м Это В О р к С вопрос л я т Это О п Это н ЧАС Это л п Это р $ О п Это н ЧАС Это л п Это р . О н С р Это а т Это ( Ф р а м Это В orkSQLiteOpenHelper.kt:244) в android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:411) в android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:316) в androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableOrReadableDatabase(FrameworkSQLiteOpenHelper.kt:232) в androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.innerGetDatabase(FrameworkSQLiteOpenHelper.kt:190) в androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getSupportDatabase(FrameworkSQLiteOpenHelper.kt:151) в androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.kt:104) в androidx.room.SQLiteCopyOpenHelper.getWritableDatabase(SQLiteCopyOpenHelper.kt:71) в androidx.room.RoomDatabase.inTransaction(RoomDatabase.kt:638) в androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.kt:457) на com.mecatronica.barbot.database.daos.CocktailDAO_Impl.getAllCocktails(CocktailDAO_Impl.java:177) на com.mecatronica.barbot.PedirTragoActivity.onCreate(PedirTragoActivity.java:63) в android.app.Activity.performCreate(Activity.java:8157) в android.app.Activity.performCreate(Activity.java:8129) в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310) в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3523) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3710) в android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) в android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) в android.app.ActivityThread$H.handleMessage(ActivityThread.java:2146) в android.os.Handler.dispatchMessage(Handler.java:106) в android.os.Looper.loop(Looper.java:236) в android.app.ActivityThread.main(ActivityThread.java:8057) в java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) 2023-09-23 17:17:30.716 8250-8250 Процесс com.mecatronica.barbot I Отправка сигнала. ПИД: 8250 СИГНАЛ: 9 Форма дампа sql test.db:
PRAGMA Foreign_keys=OFF; НАЧАТЬ ТРАНЗАКЦИЮ; СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ "ingredient_types" ( идентификатор INTEGER не равен нулю ограничение ингредиент_типы_пк основной ключ, имя ТЕКСТ ); INSERT INTO Inding_types VALUES(1,'SHAKE'); INSERT INTO Inding_types VALUES(2,'лимон'); INSERT INTO Inding_types VALUES(3,'ron'); INSERT INTO Inding_types VALUES(4,'тоника'); INSERT INTO Inding_types VALUES(5,'ginebra'); INSERT INTO Inding_types VALUES(6,'Campari'); INSERT INTO Inding_types VALUES(7,'naranja'); INSERT INTO Inding_types VALUES(8,'fernet'); INSERT INTO Inding_types VALUES(9,'кока'); INSERT INTO Inding_types VALUES(10,'durazno'); INSERT INTO Inding_types VALUES(11,'гранадина'); INSERT INTO Inding_types VALUES(12,'водка'); СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ "bottle_ingredient" ( идентификатор INTEGER не равен нулю ограничение Bottle_ingredient_pk основной ключ, BottlePos INTEGER не равен нулю ограничение Bottle_ingredient_bottles_position_fk референсные бутылки, идентификатор ингредиента INTEGER не равен нулю ограничение Bottle_ingredient_ingredient_types_id_fk ссылки на типы ингредиентов ); INSERT INTO Bottle_ingredient VALUES(1,8,5); INSERT INTO Bottle_ingredient VALUES(2,9,6); INSERT INTO Bottle_ingredient VALUES(3,10,8); INSERT INTO Bottle_ingredient VALUES(4,11,3); INSERT INTO Bottle_ingredient VALUES(5,12,12); INSERT INTO Bottle_ingredient VALUES(7,0,2); INSERT INTO Bottle_ingredient VALUES(8,1,4); INSERT INTO Bottle_ingredient VALUES(9,2,7); INSERT INTO Bottle_ingredient VALUES(10,3,9); INSERT INTO Bottle_ingredient VALUES(11,4,10); INSERT INTO Bottle_ingredient VALUES(12,5,11); INSERT INTO Bottle_ingredient VALUES(13,16,1); СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ «бутылок» ( позиция INTEGER не равна нулю ограничение бутылки_pk основной ключ, имя ТЕКСТ, емкость INTEGER не равна нулю, currentAmount INTEGER не равен нулю ); INSERT INTO Bottles VALUES(0,'limon',2000,2000); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(1,'тоника',2000,2000); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(2,'naranja',2000,2000); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ (3, «кока», 2000, 2000); INSERT INTO Bottles VALUES(4,'durazno',2000,2000); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(5,'гранадина',2000,2000); INSERT INTO Bottles VALUES(6,'Mezcla 7',1,1); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(7,'Mezcla 8',1,1); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(8,'ginebra',700,700); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ (9, «кампари», 750 750); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(10,'fernet',750,750); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ(11,'ron',750,750); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ (12, «водка», 700 700); INSERT INTO Bottles VALUES(13,'Bottle 6',1,1); INSERT INTO Bottles VALUES(14,'Bottle 7',1,1); INSERT INTO Bottles VALUES(15,'Бутылка 8',1,1); ВСТАВИТЬ В бутылки ЗНАЧЕНИЯ (16, «Шейкео», 1000,1000); СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ "cocktail_ingredients" ( идентификатор INTEGER не равен нулю ограничение Cocktail_ingredients_pk основной ключ, typeId INTEGER не равен нулю ограничение коктейль_ingredient_ingredient_types_id_fk ссылки на ингредиенты_типы, количество INTEGER не равно нулю, CocktailId INTEGER не равен нулю ограничение Cocktail_ingredients_cocktails_id_fk ссылки на коктейли ); INSERT INTO Cocktail_ingredients VALUES(1,6,60,1); INSERT INTO Cocktail_ingredients VALUES(2,7,136,1); INSERT INTO Cocktail_ingredients VALUES(3,9,146,2); INSERT INTO Cocktail_ingredients VALUES(4,8,50,2); INSERT INTO Cocktail_ingredients VALUES(5,5,60,3); INSERT INTO Cocktail_ingredients VALUES(6,4,136,3); INSERT INTO Cocktail_ingredients VALUES(7,3,50,4); INSERT INTO Cocktail_ingredients VALUES(8,9,120,4); INSERT INTO Cocktail_ingredients VALUES(9,2,10,4); INSERT INTO Cocktail_ingredients VALUES(10,12,40,5); INSERT INTO Cocktail_ingredients VALUES(11,10,20,5); INSERT INTO Cocktail_ingredients VALUES(12,7,40,5); INSERT INTO Cocktail_ingredients VALUES(13,1,30,5); INSERT INTO Cocktail_ingredients VALUES(14,11,40,5); СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ «коктейли» ( идентификатор INTEGER не равен нулю ограничение коктейлей_pk основной ключ, имя ТЕКСТ, isOnStock INTEGER не равен нулю, hasIce INTEGER не равен нулю, imgName ТЕКСТ ); INSERT INTO коктейли VALUES(1,'Campari',1,1,'Campari'); INSERT INTO коктейли VALUES(2,'fernet',1,1,'fernet'); INSERT INTO коктейли VALUES(3,'джин тоник',1,1,'гинтоник'); INSERT INTO коктейли VALUES(4,'ron cola',1,1,'roncola'); INSERT INTO коктейли VALUES(5,'sex On the Beach',1,1,'sexOnTheBeach'); СОВЕРШИТЬ;
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Приложение аварийно завершает работу при использовании поля загрузки при просмотре
Anonymous » » в форуме C# - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Приложение аварийно завершает работу при использовании поля загрузки при просмотре
Anonymous » » в форуме C# - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Приложение аварийно завершает работу при использовании поля загрузки при просмотре
Anonymous » » в форуме C# - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-