提交 e72c8a2e 编写于 作者: 假装自己很用心's avatar 假装自己很用心

更新代码

上级
# flutterDemo
A new Flutter project.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
For help getting started with Flutter, view our
[online documentation](https://flutter.dev/docs), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion 28
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
lintOptions {
disable 'InvalidPackage'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.flutterDemo"
minSdkVersion 16
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}
flutter {
source '../..'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flutterDemo">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flutterDemo">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<application
android:name="io.flutter.app.FlutterApplication"
android:label="flutterDemo"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<!-- Displays an Android View that continues showing the launch screen
Drawable until Flutter paints its first frame, then this splash
screen fades out. A splash screen is useful to avoid any visual
gap between the end of Android's launch screen and the painting of
Flutter's first frame. -->
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
package com.example.flutterDemo
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">@android:color/white</item>
</style>
</resources>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flutterDemo">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
jcenter()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
delete rootProject.buildDir
}
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android" name="Android">
<configuration>
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/app/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/app/src/main/res" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/app/src/main/assets" />
<option name="LIBS_FOLDER_RELATIVE_PATH" value="/app/src/main/libs" />
<option name="PROGUARD_LOGS_FOLDER_RELATIVE_PATH" value="/app/src/main/proguard_logs" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/app/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/app/src/main/kotlin" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" generated="true" />
</content>
<orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Flutter for Android" level="project" />
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
</component>
</module>
\ No newline at end of file
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
include ':app'
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()
assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
{
"category": [
{
"id": "c1",
"title": "意大利",
"color": "9C27B0"
},
{
"id": "c2",
"title": "简单快捷",
"color": "F44336"
},
{
"id": "c3",
"title": "汉堡包",
"color": "FF9800"
},
{
"id": "c4",
"title": "德国",
"color": "FFC107"
},
{
"id": "c5",
"title": "轻盈可爱",
"color": "2196F3"
},
{
"id": "c6",
"title": "异国情调",
"color": "4CAF50"
},
{
"id": "c7",
"title": "早餐",
"color": "03A9F4"
},
{
"id": "c8",
"title": "亚洲",
"color": "8BC34A"
},
{
"id": "c9",
"title": "法国",
"color": "E91E63"
},
{
"id": "c10",
"title": "夏天",
"color": "009688"
}
]
}
\ No newline at end of file
{
"meal": [
{
"id": "m1",
"categories": [
"c1",
"c2"
],
"title": "番茄酱意大利面",
"affordability": 0,
"complexity": 0,
"imageUrl": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Spaghetti_Bolognese_mit_Parmesan_oder_Grana_Padano.jpg/800px-Spaghetti_Bolognese_mit_Parmesan_oder_Grana_Padano.jpg",
"duration": 20,
"ingredients": [
"4个西红柿",
"一汤匙橄榄油",
"1个洋葱",
"250克意大利面",
"香料",
"奶酪(可选)"
],
"steps": [
"把西红柿和洋葱切成小块。",
"烧开水煮沸后加盐。",
"把意大利面放进开水里,大约10到12分钟就可以做好。",
"同时加热一些橄榄油,加入切好的洋葱。",
"两分钟后,加入番茄片、盐、胡椒和其他香料。",
"一旦意大利面做好了,调味汁就会做好。",
"在成品盘上随意加些奶酪。"
],
"isGlutenFree": false,
"isVegan": true,
"isVegetarian": true,
"isLactoseFree": true
},
{
"id": "m2",
"categories": [
"c2"
],
"title": "夏威夷烤面包",
"affordability": 0,
"complexity": 0,
"imageUrl": "https://cdn.pixabay.com/photo/2018/07/11/21/51/toast-3532016_1280.jpg",
"duration": 10,
"ingredients": [
"一片白面包",
"一片火腿",
"1片菠萝",
"1-2片奶酪",
"黄油"
],
"steps": [
"在白面包的一边涂黄油。",
"把火腿、菠萝和奶酪放在白面包上。",
"在200℃的烤箱中烤10分钟左右。"
],
"isGlutenFree": false,
"isVegan": false,
"isVegetarian": false,
"isLactoseFree": false
},
{
"id": "m3",
"categories": [
"c2",
"c3"
],
"title": "经典汉堡包",
"affordability": 1,
"complexity": 0,
"imageUrl": "https://cdn.pixabay.com/photo/2014/10/23/18/05/burger-500054_1280.jpg",
"duration": 45,
"ingredients": [
"300克牛扒",
"1个西红柿",
"1根黄瓜",
"1个洋葱",
"番茄酱",
"2个汉堡包子"
],
"steps": [
"形成两个馅饼。",
"每面煎约4分钟。",
"快把面包煎约1分钟。",
"番茄酱豆豉包。",
"汉堡配番茄、黄瓜和洋葱。"
],
"isGlutenFree": false,
"isVegan": false,
"isVegetarian": false,
"isLactoseFree": true
},
{
"id": "m4",
"categories": [
"c4"
],
"title": "维也纳炸小牛排",
"affordability": 2,
"complexity": 1,
"imageUrl": "https://cdn.pixabay.com/photo/2018/03/31/19/29/schnitzel-3279045_1280.jpg",
"duration": 60,
"ingredients": [
"8块小牛肉",
"4个鸡蛋",
"200克面包屑",
"100克面粉",
"300毫升黄油",
"100克植物油",
"盐",
"柠檬片"
],
"steps": [
"嫩化小牛肉至2-4毫米左右,两面加盐。",
"在一个平板上,用叉子短暂地搅拌鸡蛋。",
"在肉排上轻轻涂上面粉,然后蘸上鸡蛋,最后涂上面包屑。",
"把黄油和油放在一个大平底锅里加热(让脂肪变得很热),然后在两个平底锅上炸到金黄。",
"一定要定期地把锅扔起来,这样炸薯条就会被油包围,而且碎的东西会变得“蓬松”。",
"取出并在厨房纸上排水。把欧芹放在剩余的油里煎一下,沥乾。",
"把炸肉排放在盛满水的盘子里,用欧芹和柠檬片装饰。"
],
"isGlutenFree": false,
"isVegan": false,
"isVegetarian": false,
"isLactoseFree": false
},
{
"id": "m5",
"categories": [
"c2",
"c5",
"c10"
],
"title": "烟熏三文鱼沙拉",
"affordability": 2,
"complexity": 0,
"imageUrl": "https://cdn.pixabay.com/photo/2016/10/25/13/29/smoked-salmon-salad-1768890_1280.jpg",
"duration": 15,
"ingredients": [
"芝麻菜",
"羊肉跟生菜",
"西芹",
"茴香",
"200克熏鲑鱼",
"芥末",
"葡萄香脂",
"橄榄油",
"盐和胡椒"
],
"steps": [
"沙拉和香草洗净切块",
"把鲑鱼切成丁",
"把芥末、醋和橄榄油加工成干品",
"准备沙拉",
"加入三文鱼块和调味料"
],
"isGlutenFree": true,
"isVegan": false,
"isVegetarian": true,
"isLactoseFree": true
},
{
"id": "m6",
"categories": [
"c6",
"c10"
],
"title": "美味的橘子慕斯",
"affordability": 0,
"complexity": 2,
"imageUrl": "https://cdn.pixabay.com/photo/2017/05/01/05/18/pastry-2274750_1280.jpg",
"duration": 240,
"ingredients": [
"4片明胶",
"150毫升橙汁",
"80克糖",
"300克酸奶",
"200克奶油",
"桔皮"
],
"steps": [
"把明胶溶在锅里",
"加橙汁和糖",
"把锅从炉子上拿下来",
"加2汤匙酸奶",
"剩余酸奶拌明胶",
"放进冰箱里冷却至凉",
"搅打奶油,把它举到橘子块下面",
"再次冷却至少4小时",
"与橘皮一起食用"
],
"isGlutenFree": true,
"isVegan": false,
"isVegetarian": true,
"isLactoseFree": false
},
{
"id": "m7",
"categories": [
"c7"
],
"title": "Pancakes",
"affordability": 0,
"complexity": 0,
"imageUrl": "https://cdn.pixabay.com/photo/2018/07/10/21/23/pancake-3529653_1280.jpg",
"duration": 20,
"ingredients": [
"1/2杯通用面粉",
"1/2茶匙发酵粉",
"1茶匙盐",
"1汤匙白糖",
"1/4杯牛奶",
"1个鸡蛋",
"3汤匙黄油,融化"
],
"steps": [
"在一个大碗里,把面粉、发酵粉、盐和糖筛在一起。",
"在中间打一口井,倒入牛奶、鸡蛋和融化的黄油,搅拌均匀。",
"用中高热加热一个抹了少许油的煎锅或煎锅。",
"将面糊倒在或舀到烤架上,每个煎饼大约用1/4杯。如果两边都煎成棕色的,会很辣。"
],
"isGlutenFree": true,
"isVegan": false,
"isVegetarian": true,
"isLactoseFree": false
},
{
"id": "m8",
"categories": [
"c8"
],
"title": "印度奶油咖喱鸡",
"affordability": 1,
"complexity": 1,
"imageUrl": "https://cdn.pixabay.com/photo/2018/06/18/16/05/indian-food-3482749_1280.jpg",
"duration": 35,
"ingredients": [
"4块鸡胸肉",
"1个洋葱",
"2瓣大蒜",
"一片姜",
"4汤匙杏仁",
"1茶匙辣椒",
"500毫升椰奶"
],
"steps": [
"把鸡胸肉切成片煎一下",
"把洋葱、大蒜和姜加工成糊状,然后把所有的东西都炒熟",
"加香料炒",
"加入鸡胸肉+250毫升水,煮10分钟",
"加椰奶",
"配米饭"
],
"isGlutenFree": true,
"isVegan": false,
"isVegetarian": false,
"isLactoseFree": true
},
{
"id": "m9",
"categories": [
"c9"
],
"title": "巧克力蛋奶酥",
"affordability": 0,
"complexity": 2,
"imageUrl": "https://cdn.pixabay.com/photo/2014/08/07/21/07/souffle-412785_1280.jpg",
"duration": 45,
"ingredients": [
"1茶匙融化的黄油",
"2汤匙白糖",
"2盎司70%黑巧克力,碎块",
"1汤匙烟蒂r",
"1汤匙通用面粉",
"1/3汤匙冷牛奶",
"1夹盐",
"一撮辣椒",
"1个大蛋黄",
"2个大蛋白",
"1份奶油馅饼",
"1汤匙白糖"
],
"steps": [
"将烤箱预热至190°C。用羊皮纸在边缘烤盘上划线。",
"用1茶匙融化的黄油轻轻刷两个拉面的底部和侧面;盖上底部和侧面直到边缘。",
"在拉面上加1汤匙白糖。旋转拉面直到糖覆盖所有表面。",
"把巧克力块放在一个金属搅拌碗里。",
"把碗放在一个大约3杯热水的平底锅上。",
"在平底锅中用中火融化1汤匙黄油。撒上面粉。搅拌至面粉与黄油混合,混合物变稠。",
"在冷牛奶中搅拌直到混合物变得光滑和粘稠。把混合物和融化的巧克力一起放到碗里。",
"加入盐和辣椒。完全混合在一起。加入蛋黄搅拌均匀。",
"把碗放在热的(不是炖的)水上,一边搅拌蛋白一边让巧克力保持温暖。",
"将2个蛋白放入一个搅拌碗中;加入奶油酒石。搅拌直到混合物开始变稠,搅拌后的细雨停留在表面约1秒,然后消失在混合物中。",
"加入1/3的糖,搅拌均匀。再加点糖搅拌15秒左右。",
"把剩下的糖搅拌进去。继续搅拌,直到混合物和剃须膏一样厚,并保持柔软的峰值,3到5分钟。",
"把不到一半的蛋白转移到巧克力上",
"搅拌直到蛋白完全融入巧克力中。",
"把剩下的蛋清加入巧克力中,用抹刀轻轻地从底部提起并折叠起来。",
"蛋清消失后停止搅拌。把混合物分给两个准备好的拉面。把拉面放在准备好的烤盘上。",
"在预热的烤箱中烤12到15分钟,直到混战被吹胀并上升到边缘上方。"
],
"isGlutenFree": true,
"isVegan": false,
"isVegetarian": true,
"isLactoseFree": false
},
{
"id": "m10",
"categories": [
"c2",
"c5",
"c10"
],
"title": "芦笋色拉配樱桃番茄",
"affordability": 2,
"complexity": 0,
"imageUrl": "https://cdn.pixabay.com/photo/2018/04/09/18/26/asparagus-3304997_1280.jpg",
"duration": 30,
"ingredients": [
"白芦笋",
"30克松仁",
"300克樱桃番茄",
"蔬菜色拉",
"盐、胡椒和橄榄油"
],
"steps": [
"芦笋洗净去皮切块",
"用盐水煮",
"盐和胡椒芦笋",
"烤松子",
"把西红柿减半",
"拌芦笋、色拉和调味料",
"配法式面包"
],
"isGlutenFree": true,
"isVegan": true,
"isVegetarian": true,
"isLactoseFree": true
}
]
}
\ No newline at end of file
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
#import "FMDatabase.h"
#import "FMDatabaseAdditions.h"
#import "FMDatabasePool.h"
#import "FMDatabaseQueue.h"
#import "FMDB.h"
#import "FMResultSet.h"
FOUNDATION_EXPORT double FMDBVersionNumber;
FOUNDATION_EXPORT const unsigned char FMDBVersionString[];
#import <Foundation/Foundation.h>
FOUNDATION_EXPORT double FMDBVersionNumber;
FOUNDATION_EXPORT const unsigned char FMDBVersionString[];
#import "FMDatabase.h"
#import "FMResultSet.h"
#import "FMDatabaseAdditions.h"
#import "FMDatabaseQueue.h"
#import "FMDatabasePool.h"
//
// FMDatabaseAdditions.h
// fmdb
//
// Created by August Mueller on 10/30/05.
// Copyright 2005 Flying Meat Inc.. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "FMDatabase.h"
NS_ASSUME_NONNULL_BEGIN
/** Category of additions for `<FMDatabase>` class.
### See also
- `<FMDatabase>`
*/
@interface FMDatabase (FMDatabaseAdditions)
///----------------------------------------
/// @name Return results of SQL to variable
///----------------------------------------
/** Return `int` value for query
@param query The SQL query to be performed.
@param ... A list of parameters that will be bound to the `?` placeholders in the SQL query.
@return `int` value.
@note This is not available from Swift.
*/
- (int)intForQuery:(NSString*)query, ...;
/** Return `long` value for query
@param query The SQL query to be performed.
@param ... A list of parameters that will be bound to the `?` placeholders in the SQL query.
@return `long` value.
@note This is not available from Swift.
*/
- (long)longForQuery:(NSString*)query, ...;
/** Return `BOOL` value for query
@param query The SQL query to be performed.
@param ... A list of parameters that will be bound to the `?` placeholders in the SQL query.
@return `BOOL` value.
@note This is not available from Swift.
*/
- (BOOL)boolForQuery:(NSString*)query, ...;
/** Return `double` value for query
@param query The SQL query to be performed.
@param ... A list of parameters that will be bound to the `?` placeholders in the SQL query.
@return `double` value.
@note This is not available from Swift.
*/
- (double)doubleForQuery:(NSString*)query, ...;
/** Return `NSString` value for query
@param query The SQL query to be performed.
@param ... A list of parameters that will be bound to the `?` placeholders in the SQL query.
@return `NSString` value.
@note This is not available from Swift.
*/
- (NSString * _Nullable)stringForQuery:(NSString*)query, ...;
/** Return `NSData` value for query
@param query The SQL query to be performed.
@param ... A list of parameters that will be bound to the `?` placeholders in the SQL query.
@return `NSData` value.
@note This is not available from Swift.
*/
- (NSData * _Nullable)dataForQuery:(NSString*)query, ...;
/** Return `NSDate` value for query
@param query The SQL query to be performed.
@param ... A list of parameters that will be bound to the `?` placeholders in the SQL query.
@return `NSDate` value.
@note This is not available from Swift.
*/
- (NSDate * _Nullable)dateForQuery:(NSString*)query, ...;
// Notice that there's no dataNoCopyForQuery:.
// That would be a bad idea, because we close out the result set, and then what
// happens to the data that we just didn't copy? Who knows, not I.
///--------------------------------
/// @name Schema related operations
///--------------------------------
/** Does table exist in database?
@param tableName The name of the table being looked for.
@return `YES` if table found; `NO` if not found.
*/
- (BOOL)tableExists:(NSString*)tableName;
/** The schema of the database.
This will be the schema for the entire database. For each entity, each row of the result set will include the following fields:
- `type` - The type of entity (e.g. table, index, view, or trigger)
- `name` - The name of the object
- `tbl_name` - The name of the table to which the object references
- `rootpage` - The page number of the root b-tree page for tables and indices
- `sql` - The SQL that created the entity
@return `FMResultSet` of schema; `nil` on error.
@see [SQLite File Format](http://www.sqlite.org/fileformat.html)
*/
- (FMResultSet * _Nullable)getSchema;
/** The schema of the database.
This will be the schema for a particular table as report by SQLite `PRAGMA`, for example:
PRAGMA table_info('employees')
This will report:
- `cid` - The column ID number
- `name` - The name of the column
- `type` - The data type specified for the column
- `notnull` - whether the field is defined as NOT NULL (i.e. values required)
- `dflt_value` - The default value for the column
- `pk` - Whether the field is part of the primary key of the table
@param tableName The name of the table for whom the schema will be returned.
@return `FMResultSet` of schema; `nil` on error.
@see [table_info](http://www.sqlite.org/pragma.html#pragma_table_info)
*/
- (FMResultSet * _Nullable)getTableSchema:(NSString*)tableName;
/** Test to see if particular column exists for particular table in database
@param columnName The name of the column.
@param tableName The name of the table.
@return `YES` if column exists in table in question; `NO` otherwise.
*/
- (BOOL)columnExists:(NSString*)columnName inTableWithName:(NSString*)tableName;
/** Test to see if particular column exists for particular table in database
@param columnName The name of the column.
@param tableName The name of the table.
@return `YES` if column exists in table in question; `NO` otherwise.
@see columnExists:inTableWithName:
@warning Deprecated - use `<columnExists:inTableWithName:>` instead.
*/
- (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName __deprecated_msg("Use columnExists:inTableWithName: instead");
/** Validate SQL statement
This validates SQL statement by performing `sqlite3_prepare_v2`, but not returning the results, but instead immediately calling `sqlite3_finalize`.
@param sql The SQL statement being validated.
@param error This is a pointer to a `NSError` object that will receive the autoreleased `NSError` object if there was any error. If this is `nil`, no `NSError` result will be returned.
@return `YES` if validation succeeded without incident; `NO` otherwise.
*/
- (BOOL)validateSQL:(NSString*)sql error:(NSError * _Nullable *)error;
///-----------------------------------
/// @name Application identifier tasks
///-----------------------------------
/** Retrieve application ID
@return The `uint32_t` numeric value of the application ID.
@see setApplicationID:
*/
@property (nonatomic) uint32_t applicationID;
#if TARGET_OS_MAC && !TARGET_OS_IPHONE
/** Retrieve application ID string
@see setApplicationIDString:
*/
@property (nonatomic, retain) NSString *applicationIDString;
#endif
///-----------------------------------
/// @name user version identifier tasks
///-----------------------------------
/** Retrieve user version
@see setUserVersion:
*/
@property (nonatomic) uint32_t userVersion;
@end
NS_ASSUME_NONNULL_END
//
// FMDatabasePool.h
// fmdb
//
// Created by August Mueller on 6/22/11.
// Copyright 2011 Flying Meat Inc. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class FMDatabase;
/** Pool of `<FMDatabase>` objects.
### See also
- `<FMDatabaseQueue>`
- `<FMDatabase>`
@warning Before using `FMDatabasePool`, please consider using `<FMDatabaseQueue>` instead.
If you really really really know what you're doing and `FMDatabasePool` is what
you really really need (ie, you're using a read only database), OK you can use
it. But just be careful not to deadlock!
For an example on deadlocking, search for:
`ONLY_USE_THE_POOL_IF_YOU_ARE_DOING_READS_OTHERWISE_YOULL_DEADLOCK_USE_FMDATABASEQUEUE_INSTEAD`
in the main.m file.
*/
@interface FMDatabasePool : NSObject
/** Database path */
@property (atomic, copy, nullable) NSString *path;
/** Delegate object */
@property (atomic, assign, nullable) id delegate;
/** Maximum number of databases to create */
@property (atomic, assign) NSUInteger maximumNumberOfDatabasesToCreate;
/** Open flags */
@property (atomic, readonly) int openFlags;
/** Custom virtual file system name */
@property (atomic, copy, nullable) NSString *vfsName;
///---------------------
/// @name Initialization
///---------------------
/** Create pool using path.
@param aPath The file path of the database.
@return The `FMDatabasePool` object. `nil` on error.
*/
+ (instancetype)databasePoolWithPath:(NSString * _Nullable)aPath;
/** Create pool using file URL.
@param url The file `NSURL` of the database.
@return The `FMDatabasePool` object. `nil` on error.
*/
+ (instancetype)databasePoolWithURL:(NSURL * _Nullable)url;
/** Create pool using path and specified flags
@param aPath The file path of the database.
@param openFlags Flags passed to the openWithFlags method of the database.
@return The `FMDatabasePool` object. `nil` on error.
*/
+ (instancetype)databasePoolWithPath:(NSString * _Nullable)aPath flags:(int)openFlags;
/** Create pool using file URL and specified flags
@param url The file `NSURL` of the database.
@param openFlags Flags passed to the openWithFlags method of the database.
@return The `FMDatabasePool` object. `nil` on error.
*/
+ (instancetype)databasePoolWithURL:(NSURL * _Nullable)url flags:(int)openFlags;
/** Create pool using path.
@param aPath The file path of the database.
@return The `FMDatabasePool` object. `nil` on error.
*/
- (instancetype)initWithPath:(NSString * _Nullable)aPath;
/** Create pool using file URL.
@param url The file `NSURL of the database.
@return The `FMDatabasePool` object. `nil` on error.
*/
- (instancetype)initWithURL:(NSURL * _Nullable)url;
/** Create pool using path and specified flags.
@param aPath The file path of the database.
@param openFlags Flags passed to the openWithFlags method of the database
@return The `FMDatabasePool` object. `nil` on error.
*/
- (instancetype)initWithPath:(NSString * _Nullable)aPath flags:(int)openFlags;
/** Create pool using file URL and specified flags.
@param url The file `NSURL` of the database.
@param openFlags Flags passed to the openWithFlags method of the database
@return The `FMDatabasePool` object. `nil` on error.
*/
- (instancetype)initWithURL:(NSURL * _Nullable)url flags:(int)openFlags;
/** Create pool using path and specified flags.
@param aPath The file path of the database.
@param openFlags Flags passed to the openWithFlags method of the database
@param vfsName The name of a custom virtual file system
@return The `FMDatabasePool` object. `nil` on error.
*/
- (instancetype)initWithPath:(NSString * _Nullable)aPath flags:(int)openFlags vfs:(NSString * _Nullable)vfsName;
/** Create pool using file URL and specified flags.
@param url The file `NSURL` of the database.
@param openFlags Flags passed to the openWithFlags method of the database
@param vfsName The name of a custom virtual file system
@return The `FMDatabasePool` object. `nil` on error.
*/
- (instancetype)initWithURL:(NSURL * _Nullable)url flags:(int)openFlags vfs:(NSString * _Nullable)vfsName;
/** Returns the Class of 'FMDatabase' subclass, that will be used to instantiate database object.
Subclasses can override this method to return specified Class of 'FMDatabase' subclass.
@return The Class of 'FMDatabase' subclass, that will be used to instantiate database object.
*/
+ (Class)databaseClass;
///------------------------------------------------
/// @name Keeping track of checked in/out databases
///------------------------------------------------
/** Number of checked-in databases in pool
*/
@property (nonatomic, readonly) NSUInteger countOfCheckedInDatabases;
/** Number of checked-out databases in pool
*/
@property (nonatomic, readonly) NSUInteger countOfCheckedOutDatabases;
/** Total number of databases in pool
*/
@property (nonatomic, readonly) NSUInteger countOfOpenDatabases;
/** Release all databases in pool */
- (void)releaseAllDatabases;
///------------------------------------------
/// @name Perform database operations in pool
///------------------------------------------
/** Synchronously perform database operations in pool.
@param block The code to be run on the `FMDatabasePool` pool.
*/
- (void)inDatabase:(__attribute__((noescape)) void (^)(FMDatabase *db))block;
/** Synchronously perform database operations in pool using transaction.
@param block The code to be run on the `FMDatabasePool` pool.
@warning Unlike SQLite's `BEGIN TRANSACTION`, this method currently performs
an exclusive transaction, not a deferred transaction. This behavior
is likely to change in future versions of FMDB, whereby this method
will likely eventually adopt standard SQLite behavior and perform
deferred transactions. If you really need exclusive tranaction, it is
recommended that you use `inExclusiveTransaction`, instead, not only
to make your intent explicit, but also to future-proof your code.
*/
- (void)inTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
/** Synchronously perform database operations in pool using exclusive transaction.
@param block The code to be run on the `FMDatabasePool` pool.
*/
- (void)inExclusiveTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
/** Synchronously perform database operations in pool using deferred transaction.
@param block The code to be run on the `FMDatabasePool` pool.
*/
- (void)inDeferredTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
/** Synchronously perform database operations on queue, using immediate transactions.
@param block The code to be run on the queue of `FMDatabaseQueue`
*/
- (void)inImmediateTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
/** Synchronously perform database operations in pool using save point.
@param block The code to be run on the `FMDatabasePool` pool.
@return `NSError` object if error; `nil` if successful.
@warning You can not nest these, since calling it will pull another database out of the pool and you'll get a deadlock. If you need to nest, use `<[FMDatabase startSavePointWithName:error:]>` instead.
*/
- (NSError * _Nullable)inSavePoint:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
@end
/** FMDatabasePool delegate category
This is a category that defines the protocol for the FMDatabasePool delegate
*/
@interface NSObject (FMDatabasePoolDelegate)
/** Asks the delegate whether database should be added to the pool.
@param pool The `FMDatabasePool` object.
@param database The `FMDatabase` object.
@return `YES` if it should add database to pool; `NO` if not.
*/
- (BOOL)databasePool:(FMDatabasePool*)pool shouldAddDatabaseToPool:(FMDatabase*)database;
/** Tells the delegate that database was added to the pool.
@param pool The `FMDatabasePool` object.
@param database The `FMDatabase` object.
*/
- (void)databasePool:(FMDatabasePool*)pool didAddDatabase:(FMDatabase*)database;
@end
NS_ASSUME_NONNULL_END
//
// FMDatabaseQueue.h
// fmdb
//
// Created by August Mueller on 6/22/11.
// Copyright 2011 Flying Meat Inc. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "FMDatabase.h"
NS_ASSUME_NONNULL_BEGIN
/** To perform queries and updates on multiple threads, you'll want to use `FMDatabaseQueue`.
Using a single instance of `<FMDatabase>` from multiple threads at once is a bad idea. It has always been OK to make a `<FMDatabase>` object *per thread*. Just don't share a single instance across threads, and definitely not across multiple threads at the same time.
Instead, use `FMDatabaseQueue`. Here's how to use it:
First, make your queue.
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
Then use it like so:
[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];
FMResultSet *rs = [db executeQuery:@"select * from foo"];
while ([rs next]) {
//…
}
}];
An easy way to wrap things up in a transaction can be done like this:
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];
if (whoopsSomethingWrongHappened) {
*rollback = YES;
return;
}
// etc…
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];
}];
`FMDatabaseQueue` will run the blocks on a serialized queue (hence the name of the class). So if you call `FMDatabaseQueue`'s methods from multiple threads at the same time, they will be executed in the order they are received. This way queries and updates won't step on each other's toes, and every one is happy.
### See also
- `<FMDatabase>`
@warning Do not instantiate a single `<FMDatabase>` object and use it across multiple threads. Use `FMDatabaseQueue` instead.
@warning The calls to `FMDatabaseQueue`'s methods are blocking. So even though you are passing along blocks, they will **not** be run on another thread.
*/
@interface FMDatabaseQueue : NSObject
/** Path of database */
@property (atomic, retain, nullable) NSString *path;
/** Open flags */
@property (atomic, readonly) int openFlags;
/** Custom virtual file system name */
@property (atomic, copy, nullable) NSString *vfsName;
///----------------------------------------------------
/// @name Initialization, opening, and closing of queue
///----------------------------------------------------
/** Create queue using path.
@param aPath The file path of the database.
@return The `FMDatabaseQueue` object. `nil` on error.
*/
+ (nullable instancetype)databaseQueueWithPath:(NSString * _Nullable)aPath;
/** Create queue using file URL.
@param url The file `NSURL` of the database.
@return The `FMDatabaseQueue` object. `nil` on error.
*/
+ (nullable instancetype)databaseQueueWithURL:(NSURL * _Nullable)url;
/** Create queue using path and specified flags.
@param aPath The file path of the database.
@param openFlags Flags passed to the openWithFlags method of the database.
@return The `FMDatabaseQueue` object. `nil` on error.
*/
+ (nullable instancetype)databaseQueueWithPath:(NSString * _Nullable)aPath flags:(int)openFlags;
/** Create queue using file URL and specified flags.
@param url The file `NSURL` of the database.
@param openFlags Flags passed to the openWithFlags method of the database.
@return The `FMDatabaseQueue` object. `nil` on error.
*/
+ (nullable instancetype)databaseQueueWithURL:(NSURL * _Nullable)url flags:(int)openFlags;
/** Create queue using path.
@param aPath The file path of the database.
@return The `FMDatabaseQueue` object. `nil` on error.
*/
- (nullable instancetype)initWithPath:(NSString * _Nullable)aPath;
/** Create queue using file URL.
@param url The file `NSURL of the database.
@return The `FMDatabaseQueue` object. `nil` on error.
*/
- (nullable instancetype)initWithURL:(NSURL * _Nullable)url;
/** Create queue using path and specified flags.
@param aPath The file path of the database.
@param openFlags Flags passed to the openWithFlags method of the database.
@return The `FMDatabaseQueue` object. `nil` on error.
*/
- (nullable instancetype)initWithPath:(NSString * _Nullable)aPath flags:(int)openFlags;
/** Create queue using file URL and specified flags.
@param url The file path of the database.
@param openFlags Flags passed to the openWithFlags method of the database.
@return The `FMDatabaseQueue` object. `nil` on error.
*/
- (nullable instancetype)initWithURL:(NSURL * _Nullable)url flags:(int)openFlags;
/** Create queue using path and specified flags.
@param aPath The file path of the database.
@param openFlags Flags passed to the openWithFlags method of the database
@param vfsName The name of a custom virtual file system
@return The `FMDatabaseQueue` object. `nil` on error.
*/
- (nullable instancetype)initWithPath:(NSString * _Nullable)aPath flags:(int)openFlags vfs:(NSString * _Nullable)vfsName;
/** Create queue using file URL and specified flags.
@param url The file `NSURL of the database.
@param openFlags Flags passed to the openWithFlags method of the database
@param vfsName The name of a custom virtual file system
@return The `FMDatabaseQueue` object. `nil` on error.
*/
- (nullable instancetype)initWithURL:(NSURL * _Nullable)url flags:(int)openFlags vfs:(NSString * _Nullable)vfsName;
/** Returns the Class of 'FMDatabase' subclass, that will be used to instantiate database object.
Subclasses can override this method to return specified Class of 'FMDatabase' subclass.
@return The Class of 'FMDatabase' subclass, that will be used to instantiate database object.
*/
+ (Class)databaseClass;
/** Close database used by queue. */
- (void)close;
/** Interupt pending database operation. */
- (void)interrupt;
///-----------------------------------------------
/// @name Dispatching database operations to queue
///-----------------------------------------------
/** Synchronously perform database operations on queue.
@param block The code to be run on the queue of `FMDatabaseQueue`
*/
- (void)inDatabase:(__attribute__((noescape)) void (^)(FMDatabase *db))block;
/** Synchronously perform database operations on queue, using transactions.
@param block The code to be run on the queue of `FMDatabaseQueue`
@warning Unlike SQLite's `BEGIN TRANSACTION`, this method currently performs
an exclusive transaction, not a deferred transaction. This behavior
is likely to change in future versions of FMDB, whereby this method
will likely eventually adopt standard SQLite behavior and perform
deferred transactions. If you really need exclusive tranaction, it is
recommended that you use `inExclusiveTransaction`, instead, not only
to make your intent explicit, but also to future-proof your code.
*/
- (void)inTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
/** Synchronously perform database operations on queue, using deferred transactions.
@param block The code to be run on the queue of `FMDatabaseQueue`
*/
- (void)inDeferredTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
/** Synchronously perform database operations on queue, using exclusive transactions.
@param block The code to be run on the queue of `FMDatabaseQueue`
*/
- (void)inExclusiveTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
/** Synchronously perform database operations on queue, using immediate transactions.
@param block The code to be run on the queue of `FMDatabaseQueue`
*/
- (void)inImmediateTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
///-----------------------------------------------
/// @name Dispatching database operations to queue
///-----------------------------------------------
/** Synchronously perform database operations using save point.
@param block The code to be run on the queue of `FMDatabaseQueue`
*/
// NOTE: you can not nest these, since calling it will pull another database out of the pool and you'll get a deadlock.
// If you need to nest, use FMDatabase's startSavePointWithName:error: instead.
- (NSError * _Nullable)inSavePoint:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
///-----------------
/// @name Checkpoint
///-----------------
/** Performs a WAL checkpoint
@param checkpointMode The checkpoint mode for sqlite3_wal_checkpoint_v2
@param error The NSError corresponding to the error, if any.
@return YES on success, otherwise NO.
*/
- (BOOL)checkpoint:(FMDBCheckpointMode)checkpointMode error:(NSError * _Nullable *)error;
/** Performs a WAL checkpoint
@param checkpointMode The checkpoint mode for sqlite3_wal_checkpoint_v2
@param name The db name for sqlite3_wal_checkpoint_v2
@param error The NSError corresponding to the error, if any.
@return YES on success, otherwise NO.
*/
- (BOOL)checkpoint:(FMDBCheckpointMode)checkpointMode name:(NSString * _Nullable)name error:(NSError * _Nullable *)error;
/** Performs a WAL checkpoint
@param checkpointMode The checkpoint mode for sqlite3_wal_checkpoint_v2
@param name The db name for sqlite3_wal_checkpoint_v2
@param error The NSError corresponding to the error, if any.
@param logFrameCount If not NULL, then this is set to the total number of frames in the log file or to -1 if the checkpoint could not run because of an error or because the database is not in WAL mode.
@param checkpointCount If not NULL, then this is set to the total number of checkpointed frames in the log file (including any that were already checkpointed before the function was called) or to -1 if the checkpoint could not run due to an error or because the database is not in WAL mode.
@return YES on success, otherwise NO.
*/
- (BOOL)checkpoint:(FMDBCheckpointMode)checkpointMode name:(NSString * _Nullable)name logFrameCount:(int * _Nullable)logFrameCount checkpointCount:(int * _Nullable)checkpointCount error:(NSError * _Nullable *)error;
@end
NS_ASSUME_NONNULL_END
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
#ifndef __has_feature // Optional.
#define __has_feature(x) 0 // Compatibility with non-clang compilers.
#endif
#ifndef NS_RETURNS_NOT_RETAINED
#if __has_feature(attribute_ns_returns_not_retained)
#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
#else
#define NS_RETURNS_NOT_RETAINED
#endif
#endif
@class FMDatabase;
@class FMStatement;
/** Represents the results of executing a query on an `<FMDatabase>`.
### See also
- `<FMDatabase>`
*/
@interface FMResultSet : NSObject
@property (nonatomic, retain, nullable) FMDatabase *parentDB;
///-----------------
/// @name Properties
///-----------------
/** Executed query */
@property (atomic, retain, nullable) NSString *query;
/** `NSMutableDictionary` mapping column names to numeric index */
@property (readonly) NSMutableDictionary *columnNameToIndexMap;
/** `FMStatement` used by result set. */
@property (atomic, retain, nullable) FMStatement *statement;
///------------------------------------
/// @name Creating and closing a result set
///------------------------------------
/** Create result set from `<FMStatement>`
@param statement A `<FMStatement>` to be performed
@param aDB A `<FMDatabase>` to be used
@return A `FMResultSet` on success; `nil` on failure
*/
+ (instancetype)resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB;
/** Close result set */
- (void)close;
///---------------------------------------
/// @name Iterating through the result set
///---------------------------------------
/** Retrieve next row for result set.
You must always invoke `next` or `nextWithError` before attempting to access the values returned in a query, even if you're only expecting one.
@return `YES` if row successfully retrieved; `NO` if end of result set reached
@see hasAnotherRow
*/
- (BOOL)next;
/** Retrieve next row for result set.
You must always invoke `next` or `nextWithError` before attempting to access the values returned in a query, even if you're only expecting one.
@param outErr A 'NSError' object to receive any error object (if any).
@return 'YES' if row successfully retrieved; 'NO' if end of result set reached
@see hasAnotherRow
*/
- (BOOL)nextWithError:(NSError * _Nullable *)outErr;
/** Did the last call to `<next>` succeed in retrieving another row?
@return `YES` if the last call to `<next>` succeeded in retrieving another record; `NO` if not.
@see next
@warning The `hasAnotherRow` method must follow a call to `<next>`. If the previous database interaction was something other than a call to `next`, then this method may return `NO`, whether there is another row of data or not.
*/
- (BOOL)hasAnotherRow;
///---------------------------------------------
/// @name Retrieving information from result set
///---------------------------------------------
/** How many columns in result set
@return Integer value of the number of columns.
*/
@property (nonatomic, readonly) int columnCount;
/** Column index for column name
@param columnName `NSString` value of the name of the column.
@return Zero-based index for column.
*/
- (int)columnIndexForName:(NSString*)columnName;
/** Column name for column index
@param columnIdx Zero-based index for column.
@return columnName `NSString` value of the name of the column.
*/
- (NSString * _Nullable)columnNameForIndex:(int)columnIdx;
/** Result set integer value for column.
@param columnName `NSString` value of the name of the column.
@return `int` value of the result set's column.
*/
- (int)intForColumn:(NSString*)columnName;
/** Result set integer value for column.
@param columnIdx Zero-based index for column.
@return `int` value of the result set's column.
*/
- (int)intForColumnIndex:(int)columnIdx;
/** Result set `long` value for column.
@param columnName `NSString` value of the name of the column.
@return `long` value of the result set's column.
*/
- (long)longForColumn:(NSString*)columnName;
/** Result set long value for column.
@param columnIdx Zero-based index for column.
@return `long` value of the result set's column.
*/
- (long)longForColumnIndex:(int)columnIdx;
/** Result set `long long int` value for column.
@param columnName `NSString` value of the name of the column.
@return `long long int` value of the result set's column.
*/
- (long long int)longLongIntForColumn:(NSString*)columnName;
/** Result set `long long int` value for column.
@param columnIdx Zero-based index for column.
@return `long long int` value of the result set's column.
*/
- (long long int)longLongIntForColumnIndex:(int)columnIdx;
/** Result set `unsigned long long int` value for column.
@param columnName `NSString` value of the name of the column.
@return `unsigned long long int` value of the result set's column.
*/
- (unsigned long long int)unsignedLongLongIntForColumn:(NSString*)columnName;
/** Result set `unsigned long long int` value for column.
@param columnIdx Zero-based index for column.
@return `unsigned long long int` value of the result set's column.
*/
- (unsigned long long int)unsignedLongLongIntForColumnIndex:(int)columnIdx;
/** Result set `BOOL` value for column.
@param columnName `NSString` value of the name of the column.
@return `BOOL` value of the result set's column.
*/
- (BOOL)boolForColumn:(NSString*)columnName;
/** Result set `BOOL` value for column.
@param columnIdx Zero-based index for column.
@return `BOOL` value of the result set's column.
*/
- (BOOL)boolForColumnIndex:(int)columnIdx;
/** Result set `double` value for column.
@param columnName `NSString` value of the name of the column.
@return `double` value of the result set's column.
*/
- (double)doubleForColumn:(NSString*)columnName;
/** Result set `double` value for column.
@param columnIdx Zero-based index for column.
@return `double` value of the result set's column.
*/
- (double)doubleForColumnIndex:(int)columnIdx;
/** Result set `NSString` value for column.
@param columnName `NSString` value of the name of the column.
@return String value of the result set's column.
*/
- (NSString * _Nullable)stringForColumn:(NSString*)columnName;
/** Result set `NSString` value for column.
@param columnIdx Zero-based index for column.
@return String value of the result set's column.
*/
- (NSString * _Nullable)stringForColumnIndex:(int)columnIdx;
/** Result set `NSDate` value for column.
@param columnName `NSString` value of the name of the column.
@return Date value of the result set's column.
*/
- (NSDate * _Nullable)dateForColumn:(NSString*)columnName;
/** Result set `NSDate` value for column.
@param columnIdx Zero-based index for column.
@return Date value of the result set's column.
*/
- (NSDate * _Nullable)dateForColumnIndex:(int)columnIdx;
/** Result set `NSData` value for column.
This is useful when storing binary data in table (such as image or the like).
@param columnName `NSString` value of the name of the column.
@return Data value of the result set's column.
*/
- (NSData * _Nullable)dataForColumn:(NSString*)columnName;
/** Result set `NSData` value for column.
@param columnIdx Zero-based index for column.
@return Data value of the result set's column.
*/
- (NSData * _Nullable)dataForColumnIndex:(int)columnIdx;
/** Result set `(const unsigned char *)` value for column.
@param columnName `NSString` value of the name of the column.
@return `(const unsigned char *)` value of the result set's column.
*/
- (const unsigned char * _Nullable)UTF8StringForColumn:(NSString*)columnName;
- (const unsigned char * _Nullable)UTF8StringForColumnName:(NSString*)columnName __deprecated_msg("Use UTF8StringForColumn instead");
/** Result set `(const unsigned char *)` value for column.
@param columnIdx Zero-based index for column.
@return `(const unsigned char *)` value of the result set's column.
*/
- (const unsigned char * _Nullable)UTF8StringForColumnIndex:(int)columnIdx;
/** Result set object for column.
@param columnName Name of the column.
@return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object.
@see objectForKeyedSubscript:
*/
- (id _Nullable)objectForColumn:(NSString*)columnName;
- (id _Nullable)objectForColumnName:(NSString*)columnName __deprecated_msg("Use objectForColumn instead");
/** Result set object for column.
@param columnIdx Zero-based index for column.
@return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object.
@see objectAtIndexedSubscript:
*/
- (id _Nullable)objectForColumnIndex:(int)columnIdx;
/** Result set object for column.
This method allows the use of the "boxed" syntax supported in Modern Objective-C. For example, by defining this method, the following syntax is now supported:
id result = rs[@"employee_name"];
This simplified syntax is equivalent to calling:
id result = [rs objectForKeyedSubscript:@"employee_name"];
which is, it turns out, equivalent to calling:
id result = [rs objectForColumnName:@"employee_name"];
@param columnName `NSString` value of the name of the column.
@return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object.
*/
- (id _Nullable)objectForKeyedSubscript:(NSString *)columnName;
/** Result set object for column.
This method allows the use of the "boxed" syntax supported in Modern Objective-C. For example, by defining this method, the following syntax is now supported:
id result = rs[0];
This simplified syntax is equivalent to calling:
id result = [rs objectForKeyedSubscript:0];
which is, it turns out, equivalent to calling:
id result = [rs objectForColumnName:0];
@param columnIdx Zero-based index for column.
@return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object.
*/
- (id _Nullable)objectAtIndexedSubscript:(int)columnIdx;
/** Result set `NSData` value for column.
@param columnName `NSString` value of the name of the column.
@return Data value of the result set's column.
@warning If you are going to use this data after you iterate over the next row, or after you close the
result set, make sure to make a copy of the data first (or just use `<dataForColumn:>`/`<dataForColumnIndex:>`)
If you don't, you're going to be in a world of hurt when you try and use the data.
*/
- (NSData * _Nullable)dataNoCopyForColumn:(NSString *)columnName NS_RETURNS_NOT_RETAINED;
/** Result set `NSData` value for column.
@param columnIdx Zero-based index for column.
@return Data value of the result set's column.
@warning If you are going to use this data after you iterate over the next row, or after you close the
result set, make sure to make a copy of the data first (or just use `<dataForColumn:>`/`<dataForColumnIndex:>`)
If you don't, you're going to be in a world of hurt when you try and use the data.
*/
- (NSData * _Nullable)dataNoCopyForColumnIndex:(int)columnIdx NS_RETURNS_NOT_RETAINED;
/** Is the column `NULL`?
@param columnIdx Zero-based index for column.
@return `YES` if column is `NULL`; `NO` if not `NULL`.
*/
- (BOOL)columnIndexIsNull:(int)columnIdx;
/** Is the column `NULL`?
@param columnName `NSString` value of the name of the column.
@return `YES` if column is `NULL`; `NO` if not `NULL`.
*/
- (BOOL)columnIsNull:(NSString*)columnName;
/** Returns a dictionary of the row results mapped to case sensitive keys of the column names.
@warning The keys to the dictionary are case sensitive of the column names.
*/
@property (nonatomic, readonly, nullable) NSDictionary *resultDictionary;
/** Returns a dictionary of the row results
@see resultDictionary
@warning **Deprecated**: Please use `<resultDictionary>` instead. Also, beware that `<resultDictionary>` is case sensitive!
*/
- (NSDictionary * _Nullable)resultDict __deprecated_msg("Use resultDictionary instead");
///-----------------------------
/// @name Key value coding magic
///-----------------------------
/** Performs `setValue` to yield support for key value observing.
@param object The object for which the values will be set. This is the key-value-coding compliant object that you might, for example, observe.
*/
- (void)kvcMagic:(id)object;
@end
NS_ASSUME_NONNULL_END
framework module FMDB {
umbrella header "FMDB-umbrella.h"
export *
module * { export * }
}
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
FOUNDATION_EXPORT double Pods_RunnerVersionNumber;
FOUNDATION_EXPORT const unsigned char Pods_RunnerVersionString[];
framework module Pods_Runner {
umbrella header "Pods-Runner-umbrella.h"
export *
module * { export * }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>8.0</string>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
tIuwG6jvd8aB/qao7bitknIML3k=
</data>
<key>flutter_assets/AssetManifest.json</key>
<data>
vPKZFKqxOAyFIEN5/owS2YIMaMA=
</data>
<key>flutter_assets/FontManifest.json</key>
<data>
lILml1/Dm8FIsisqu4EM3Kg929Q=
</data>
<key>flutter_assets/LICENSE</key>
<data>
udZl7+I1sBbe87hDM2XxVZcXwzU=
</data>
<key>flutter_assets/assets/json/category.json</key>
<data>
CzqCjTxO4/B15ZD83YQ/qir6L9I=
</data>
<key>flutter_assets/assets/json/meal.json</key>
<data>
XbuO1DOkLC4lvOkO2UwOLmhAIRw=
</data>
<key>flutter_assets/fonts/MaterialIcons-Regular.ttf</key>
<data>
nIzDzw7hjOThppiX5OleKNAxtqM=
</data>
<key>flutter_assets/isolate_snapshot_data</key>
<data>
zIBm0C+IF1Uyd0Ysus7GG/2t3BY=
</data>
<key>flutter_assets/kernel_blob.bin</key>
<data>
1NJ4ORicsJMBcV4JQtTj1XrTSOo=
</data>
<key>flutter_assets/packages/cupertino_icons/assets/CupertinoIcons.ttf</key>
<data>
TdRNbRcrlXQQgeiweLFizPmk92g=
</data>
<key>flutter_assets/vm_snapshot_data</key>
<data>
c4lES89gGDE/pbQYZAtZSx0P7XQ=
</data>
</dict>
<key>files2</key>
<dict>
<key>flutter_assets/AssetManifest.json</key>
<dict>
<key>hash</key>
<data>
vPKZFKqxOAyFIEN5/owS2YIMaMA=
</data>
<key>hash2</key>
<data>
I2NTzPsdHmBwXjx4grZ0UwB+srRfia7EX1ut/EqmbqM=
</data>
</dict>
<key>flutter_assets/FontManifest.json</key>
<dict>
<key>hash</key>
<data>
lILml1/Dm8FIsisqu4EM3Kg929Q=
</data>
<key>hash2</key>
<data>
YwkPE2N7k/su9XjVFpdeoUy7GFY9DEY+G4h3aEyC1dg=
</data>
</dict>
<key>flutter_assets/LICENSE</key>
<dict>
<key>hash</key>
<data>
udZl7+I1sBbe87hDM2XxVZcXwzU=
</data>
<key>hash2</key>
<data>
w09Huyo0Abb8gQQA+zo82ScvDKnN7ipZmyq9bo5XTSg=
</data>
</dict>
<key>flutter_assets/assets/json/category.json</key>
<dict>
<key>hash</key>
<data>
CzqCjTxO4/B15ZD83YQ/qir6L9I=
</data>
<key>hash2</key>
<data>
Crb0Im3yATTSEsmpWCKrKAEjKyS8YYvs2/5r4T6w57k=
</data>
</dict>
<key>flutter_assets/assets/json/meal.json</key>
<dict>
<key>hash</key>
<data>
XbuO1DOkLC4lvOkO2UwOLmhAIRw=
</data>
<key>hash2</key>
<data>
N/bnYKyK/qVKC+oSSzLIvHb/JLnd5qHPQQkTLARKV/0=
</data>
</dict>
<key>flutter_assets/fonts/MaterialIcons-Regular.ttf</key>
<dict>
<key>hash</key>
<data>
nIzDzw7hjOThppiX5OleKNAxtqM=
</data>
<key>hash2</key>
<data>
Wuh7JiGdsCj8cMnXMpa8jtW4ekzRz359zPE0NyQ7iRE=
</data>
</dict>
<key>flutter_assets/isolate_snapshot_data</key>
<dict>
<key>hash</key>
<data>
zIBm0C+IF1Uyd0Ysus7GG/2t3BY=
</data>
<key>hash2</key>
<data>
fBGLLWoPsd6V2gnnkU1Ii6PABIH9UtqGJ5s6qgAnF9c=
</data>
</dict>
<key>flutter_assets/kernel_blob.bin</key>
<dict>
<key>hash</key>
<data>
1NJ4ORicsJMBcV4JQtTj1XrTSOo=
</data>
<key>hash2</key>
<data>
DZMjTGtWayZfUZHa9RUavPshFmmvgW0OjGsxTVMRiXY=
</data>
</dict>
<key>flutter_assets/packages/cupertino_icons/assets/CupertinoIcons.ttf</key>
<dict>
<key>hash</key>
<data>
TdRNbRcrlXQQgeiweLFizPmk92g=
</data>
<key>hash2</key>
<data>
d6fK2iHuml40zu1xSV3HnoE9PVFhQREGOzVfduySSBY=
</data>
</dict>
<key>flutter_assets/vm_snapshot_data</key>
<dict>
<key>hash</key>
<data>
c4lES89gGDE/pbQYZAtZSx0P7XQ=
</data>
<key>hash2</key>
<data>
I5M7BRnkIZ7bmTulf1uN2H/2vYEAv6BPRMrt+7Mz9lM=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>
{"packages/cupertino_icons/assets/CupertinoIcons.ttf":["packages/cupertino_icons/assets/CupertinoIcons.ttf"],"assets/json/category.json":["assets/json/category.json"],"assets/json/meal.json":["assets/json/meal.json"]}
\ No newline at end of file
[{"family":"MaterialIcons","fonts":[{"asset":"fonts/MaterialIcons-Regular.ttf"}]},{"family":"packages/cupertino_icons/CupertinoIcons","fonts":[{"asset":"packages/cupertino_icons/assets/CupertinoIcons.ttf"}]}]
\ No newline at end of file
{
"category": [
{
"id": "c1",
"title": "意大利",
"color": "9C27B0"
},
{
"id": "c2",
"title": "简单快捷",
"color": "F44336"
},
{
"id": "c3",
"title": "汉堡包",
"color": "FF9800"
},
{
"id": "c4",
"title": "德国",
"color": "FFC107"
},
{
"id": "c5",
"title": "轻盈可爱",
"color": "2196F3"
},
{
"id": "c6",
"title": "异国情调",
"color": "4CAF50"
},
{
"id": "c7",
"title": "早餐",
"color": "03A9F4"
},
{
"id": "c8",
"title": "亚洲",
"color": "8BC34A"
},
{
"id": "c9",
"title": "法国",
"color": "E91E63"
},
{
"id": "c10",
"title": "夏天",
"color": "009688"
}
]
}
\ No newline at end of file
{
"meal": [
{
"id": "m1",
"categories": [
"c1",
"c2"
],
"title": "番茄酱意大利面",
"affordability": 0,
"complexity": 0,
"imageUrl": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Spaghetti_Bolognese_mit_Parmesan_oder_Grana_Padano.jpg/800px-Spaghetti_Bolognese_mit_Parmesan_oder_Grana_Padano.jpg",
"duration": 20,
"ingredients": [
"4个西红柿",
"一汤匙橄榄油",
"1个洋葱",
"250克意大利面",
"香料",
"奶酪(可选)"
],
"steps": [
"把西红柿和洋葱切成小块。",
"烧开水煮沸后加盐。",
"把意大利面放进开水里,大约10到12分钟就可以做好。",
"同时加热一些橄榄油,加入切好的洋葱。",
"两分钟后,加入番茄片、盐、胡椒和其他香料。",
"一旦意大利面做好了,调味汁就会做好。",
"在成品盘上随意加些奶酪。"
],
"isGlutenFree": false,
"isVegan": true,
"isVegetarian": true,
"isLactoseFree": true
},
{
"id": "m2",
"categories": [
"c2"
],
"title": "夏威夷烤面包",
"affordability": 0,
"complexity": 0,
"imageUrl": "https://cdn.pixabay.com/photo/2018/07/11/21/51/toast-3532016_1280.jpg",
"duration": 10,
"ingredients": [
"一片白面包",
"一片火腿",
"1片菠萝",
"1-2片奶酪",
"黄油"
],
"steps": [
"在白面包的一边涂黄油。",
"把火腿、菠萝和奶酪放在白面包上。",
"在200℃的烤箱中烤10分钟左右。"
],
"isGlutenFree": false,
"isVegan": false,
"isVegetarian": false,
"isLactoseFree": false
},
{
"id": "m3",
"categories": [
"c2",
"c3"
],
"title": "经典汉堡包",
"affordability": 1,
"complexity": 0,
"imageUrl": "https://cdn.pixabay.com/photo/2014/10/23/18/05/burger-500054_1280.jpg",
"duration": 45,
"ingredients": [
"300克牛扒",
"1个西红柿",
"1根黄瓜",
"1个洋葱",
"番茄酱",
"2个汉堡包子"
],
"steps": [
"形成两个馅饼。",
"每面煎约4分钟。",
"快把面包煎约1分钟。",
"番茄酱豆豉包。",
"汉堡配番茄、黄瓜和洋葱。"
],
"isGlutenFree": false,
"isVegan": false,
"isVegetarian": false,
"isLactoseFree": true
},
{
"id": "m4",
"categories": [
"c4"
],
"title": "维也纳炸小牛排",
"affordability": 2,
"complexity": 1,
"imageUrl": "https://cdn.pixabay.com/photo/2018/03/31/19/29/schnitzel-3279045_1280.jpg",
"duration": 60,
"ingredients": [
"8块小牛肉",
"4个鸡蛋",
"200克面包屑",
"100克面粉",
"300毫升黄油",
"100克植物油",
"盐",
"柠檬片"
],
"steps": [
"嫩化小牛肉至2-4毫米左右,两面加盐。",
"在一个平板上,用叉子短暂地搅拌鸡蛋。",
"在肉排上轻轻涂上面粉,然后蘸上鸡蛋,最后涂上面包屑。",
"把黄油和油放在一个大平底锅里加热(让脂肪变得很热),然后在两个平底锅上炸到金黄。",
"一定要定期地把锅扔起来,这样炸薯条就会被油包围,而且碎的东西会变得“蓬松”。",
"取出并在厨房纸上排水。把欧芹放在剩余的油里煎一下,沥乾。",
"把炸肉排放在盛满水的盘子里,用欧芹和柠檬片装饰。"
],
"isGlutenFree": false,
"isVegan": false,
"isVegetarian": false,
"isLactoseFree": false
},
{
"id": "m5",
"categories": [
"c2",
"c5",
"c10"
],
"title": "烟熏三文鱼沙拉",
"affordability": 2,
"complexity": 0,
"imageUrl": "https://cdn.pixabay.com/photo/2016/10/25/13/29/smoked-salmon-salad-1768890_1280.jpg",
"duration": 15,
"ingredients": [
"芝麻菜",
"羊肉跟生菜",
"西芹",
"茴香",
"200克熏鲑鱼",
"芥末",
"葡萄香脂",
"橄榄油",
"盐和胡椒"
],
"steps": [
"沙拉和香草洗净切块",
"把鲑鱼切成丁",
"把芥末、醋和橄榄油加工成干品",
"准备沙拉",
"加入三文鱼块和调味料"
],
"isGlutenFree": true,
"isVegan": false,
"isVegetarian": true,
"isLactoseFree": true
},
{
"id": "m6",
"categories": [
"c6",
"c10"
],
"title": "美味的橘子慕斯",
"affordability": 0,
"complexity": 2,
"imageUrl": "https://cdn.pixabay.com/photo/2017/05/01/05/18/pastry-2274750_1280.jpg",
"duration": 240,
"ingredients": [
"4片明胶",
"150毫升橙汁",
"80克糖",
"300克酸奶",
"200克奶油",
"桔皮"
],
"steps": [
"把明胶溶在锅里",
"加橙汁和糖",
"把锅从炉子上拿下来",
"加2汤匙酸奶",
"剩余酸奶拌明胶",
"放进冰箱里冷却至凉",
"搅打奶油,把它举到橘子块下面",
"再次冷却至少4小时",
"与橘皮一起食用"
],
"isGlutenFree": true,
"isVegan": false,
"isVegetarian": true,
"isLactoseFree": false
},
{
"id": "m7",
"categories": [
"c7"
],
"title": "Pancakes",
"affordability": 0,
"complexity": 0,
"imageUrl": "https://cdn.pixabay.com/photo/2018/07/10/21/23/pancake-3529653_1280.jpg",
"duration": 20,
"ingredients": [
"1/2杯通用面粉",
"1/2茶匙发酵粉",
"1茶匙盐",
"1汤匙白糖",
"1/4杯牛奶",
"1个鸡蛋",
"3汤匙黄油,融化"
],
"steps": [
"在一个大碗里,把面粉、发酵粉、盐和糖筛在一起。",
"在中间打一口井,倒入牛奶、鸡蛋和融化的黄油,搅拌均匀。",
"用中高热加热一个抹了少许油的煎锅或煎锅。",
"将面糊倒在或舀到烤架上,每个煎饼大约用1/4杯。如果两边都煎成棕色的,会很辣。"
],
"isGlutenFree": true,
"isVegan": false,
"isVegetarian": true,
"isLactoseFree": false
},
{
"id": "m8",
"categories": [
"c8"
],
"title": "印度奶油咖喱鸡",
"affordability": 1,
"complexity": 1,
"imageUrl": "https://cdn.pixabay.com/photo/2018/06/18/16/05/indian-food-3482749_1280.jpg",
"duration": 35,
"ingredients": [
"4块鸡胸肉",
"1个洋葱",
"2瓣大蒜",
"一片姜",
"4汤匙杏仁",
"1茶匙辣椒",
"500毫升椰奶"
],
"steps": [
"把鸡胸肉切成片煎一下",
"把洋葱、大蒜和姜加工成糊状,然后把所有的东西都炒熟",
"加香料炒",
"加入鸡胸肉+250毫升水,煮10分钟",
"加椰奶",
"配米饭"
],
"isGlutenFree": true,
"isVegan": false,
"isVegetarian": false,
"isLactoseFree": true
},
{
"id": "m9",
"categories": [
"c9"
],
"title": "巧克力蛋奶酥",
"affordability": 0,
"complexity": 2,
"imageUrl": "https://cdn.pixabay.com/photo/2014/08/07/21/07/souffle-412785_1280.jpg",
"duration": 45,
"ingredients": [
"1茶匙融化的黄油",
"2汤匙白糖",
"2盎司70%黑巧克力,碎块",
"1汤匙烟蒂r",
"1汤匙通用面粉",
"1/3汤匙冷牛奶",
"1夹盐",
"一撮辣椒",
"1个大蛋黄",
"2个大蛋白",
"1份奶油馅饼",
"1汤匙白糖"
],
"steps": [
"将烤箱预热至190°C。用羊皮纸在边缘烤盘上划线。",
"用1茶匙融化的黄油轻轻刷两个拉面的底部和侧面;盖上底部和侧面直到边缘。",
"在拉面上加1汤匙白糖。旋转拉面直到糖覆盖所有表面。",
"把巧克力块放在一个金属搅拌碗里。",
"把碗放在一个大约3杯热水的平底锅上。",
"在平底锅中用中火融化1汤匙黄油。撒上面粉。搅拌至面粉与黄油混合,混合物变稠。",
"在冷牛奶中搅拌直到混合物变得光滑和粘稠。把混合物和融化的巧克力一起放到碗里。",
"加入盐和辣椒。完全混合在一起。加入蛋黄搅拌均匀。",
"把碗放在热的(不是炖的)水上,一边搅拌蛋白一边让巧克力保持温暖。",
"将2个蛋白放入一个搅拌碗中;加入奶油酒石。搅拌直到混合物开始变稠,搅拌后的细雨停留在表面约1秒,然后消失在混合物中。",
"加入1/3的糖,搅拌均匀。再加点糖搅拌15秒左右。",
"把剩下的糖搅拌进去。继续搅拌,直到混合物和剃须膏一样厚,并保持柔软的峰值,3到5分钟。",
"把不到一半的蛋白转移到巧克力上",
"搅拌直到蛋白完全融入巧克力中。",
"把剩下的蛋清加入巧克力中,用抹刀轻轻地从底部提起并折叠起来。",
"蛋清消失后停止搅拌。把混合物分给两个准备好的拉面。把拉面放在准备好的烤盘上。",
"在预热的烤箱中烤12到15分钟,直到混战被吹胀并上升到边缘上方。"
],
"isGlutenFree": true,
"isVegan": false,
"isVegetarian": true,
"isLactoseFree": false
},
{
"id": "m10",
"categories": [
"c2",
"c5",
"c10"
],
"title": "芦笋色拉配樱桃番茄",
"affordability": 2,
"complexity": 0,
"imageUrl": "https://cdn.pixabay.com/photo/2018/04/09/18/26/asparagus-3304997_1280.jpg",
"duration": 30,
"ingredients": [
"白芦笋",
"30克松仁",
"300克樱桃番茄",
"蔬菜色拉",
"盐、胡椒和橄榄油"
],
"steps": [
"芦笋洗净去皮切块",
"用盐水煮",
"盐和胡椒芦笋",
"烤松子",
"把西红柿减半",
"拌芦笋、色拉和调味料",
"配法式面包"
],
"isGlutenFree": true,
"isVegan": true,
"isVegetarian": true,
"isLactoseFree": true
}
]
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
Zz0JAugYZfBwwiK/P67TYgDI9ZU=
</data>
</dict>
<key>files2</key>
<dict/>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>Flutter</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Flutter</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>8.0</string>
<key>FlutterEngine</key>
<string>ee76268252c22f5c11e82a7b87423ca3982e51a7</string>
<key>ClangVersion</key>
<string>Fuchsia clang version 8.0.0 (based on LLVM 8.0.0svn)</string>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
6Wx47HgGtA8tVVces84A4NuoAhM=
</data>
<key>icudtl.dat</key>
<data>
z32dyLOVE4+TKehZcBQlHkxsxKQ=
</data>
</dict>
<key>files2</key>
<dict>
<key>icudtl.dat</key>
<dict>
<key>hash</key>
<data>
z32dyLOVE4+TKehZcBQlHkxsxKQ=
</data>
<key>hash2</key>
<data>
zdr5Vzvecp4snhYdlNG4xyqroPTCh6TeJWIkNMcEyTE=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
QvahLRQ6gbwO+qYZpI09vfVMVfI=
</data>
</dict>
<key>files2</key>
<dict/>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
nUmte3T6aXVmJjHv1Li6Zpl7xWo=
</data>
</dict>
<key>files2</key>
<dict/>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册