Sqlite 带有Flatter moor的列名称不明确
我的结构如下:Sqlite 带有Flatter moor的列名称不明确,sqlite,flutter,dart,flutter-moor,Sqlite,Flutter,Dart,Flutter Moor,我的结构如下: import 'package:moor_flutter/moor_flutter.dart'; export 'package:moor_flutter/moor_flutter.dart' show Value; part 'moor_database.g.dart'; @DataClassName('Story') class Stories extends Table { IntColumn get id => integer().autoIncrement
import 'package:moor_flutter/moor_flutter.dart';
export 'package:moor_flutter/moor_flutter.dart' show Value;
part 'moor_database.g.dart';
@DataClassName('Story')
class Stories extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get title => text().withLength(max: 20).nullable()();
TextColumn get storyText => text().nullable()();
TextColumn get feeling => text().withLength(max: 1).nullable()();
DateTimeColumn get date => dateTime()();
DateTimeColumn get createdAt => dateTime()();
}
class Images extends Table {
IntColumn get id => integer().autoIncrement()();
IntColumn get storyId =>
integer().nullable().customConstraint('NULL REFERENCES stories(id)')();
TextColumn get path => text()();
}
class CompleteStory {
final Story story;
final List<Image> images;
CompleteStory({
this.story,
this.images,
});
}
@UseMoor(tables: [Stories, Images], daos: [StoryDao, ImageDao])
class AppDatabase extends _$AppDatabase {
AppDatabase()
: super(FlutterQueryExecutor.inDatabaseFolder(
path: 'db.sqlite',
logStatements: true,
));
@override
int get schemaVersion => 2;
@override
MigrationStrategy get migration {
return MigrationStrategy(
beforeOpen: (details) async {
await customStatement('PRAGMA foreign_keys = ON');
},
);
}
}
@UseDao(tables: [Stories, Images])
class StoryDao extends DatabaseAccessor<AppDatabase> with _$StoryDaoMixin {
final AppDatabase db;
StoryDao(this.db) : super(db);
Future<List<Story>> getAllStories() => select(stories).get();
Stream<List<CompleteStory>> watchAllStories() {
return (select(stories)
..orderBy([
(s) => OrderingTerm(expression: s.date, mode: OrderingMode.asc),
]))
.join([
leftOuterJoin(stories, stories.id.equalsExp(images.storyId)),
])
.watch()
.map((rows) {
final groupedData = <Story, List<Image>>{};
for (final row in rows) {
final story = row.readTable(stories);
final image = row.readTable(images);
final list = groupedData.putIfAbsent(story, () => []);
if (image != null) list.add(image);
}
print(groupedData.entries);
return [
for (final entry in groupedData.entries)
CompleteStory(story: entry.key, images: entry.value)
];
});
}
Future insertStory(Insertable<Story> story) => into(stories).insert(story);
Future updateStory(Insertable<Story> story) => update(stories).replace(story);
Future deleteStory(Insertable<Story> story) => delete(stories).delete(story);
}
@UseDao(tables: [Images])
class ImageDao extends DatabaseAccessor<AppDatabase> with _$ImageDaoMixin {
final AppDatabase db;
ImageDao(this.db) : super(db);
Stream<List<Image>> watchImages() => select(images).watch();
Future insertImage(Insertable<Image> image) => into(images).insert(image);
}
import'package:moor_flatter/moor_flatter.dart';
“出口”包装:moor_颤振/moor_颤振。dart“显示价值;
“摩尔大学数据库g.dart”部分;
@DataClassName('故事')
类故事扩展表{
IntColumn get id=>integer().autoIncrement();
TextColumn get title=>text().withLength(最大值:20).nullable();
TextColumn get storyText=>text().nullable();
TextColumn get feeling=>text().withLength(最大值:1).nullable();
DateTimeColumn获取日期=>dateTime();
DateTimeColumn get createdAt=>dateTime();
}
类图像扩展表{
IntColumn get id=>integer().autoIncrement();
IntColumn获取故事ID=>
integer().nullable().customConstraint('NULL引用故事(id)')();
TextColumn get path=>text();
}
类完全理论{
最后的故事;
最后列出图像;
完整的({
这个故事,,
这是一张照片,
});
}
@UseMoor(表:[故事,图像],daos:[故事,图像])
类AppDatabase扩展了$AppDatabase{
AppDatabase()
:super(flatterQueryExecutor.inDatabaseFolder)(
路径:“db.sqlite”,
对,,
));
@凌驾
int get schemaVersion=>2;
@凌驾
迁移策略获取迁移{
返回迁移策略(
beforeOpen:(详细信息)异步{
等待customStatement('PRAGMA foreign_keys=ON');
},
);
}
}
@UseDao(表:[故事,图像])
类StoryDao使用$StoryDaoMixin扩展DatabaseAccessor{
最终数据库数据库;
StoryDao(this.db):super(db);
Future getAllStories()=>选择(故事).get();
streamwatchallstories(){
返回(选择(故事)
…订购人([
(s) =>OrderingTerm(表达式:s.date,mode:OrderingMode.asc),
]))
.加入([
leftOuterJoin(stories,stories.id.equalsExp(images.storyId)),
])
.手表
.map((行){
最终分组数据={};
用于(行中的最后一行){
最终故事=row.readTable(故事);
最终图像=行可读性(图像);
最终列表=groupedData.putIfAbsent(story,()=>[]);
if(image!=null)list.add(image);
}
打印(groupedData.entries);
返回[
对于(groupedData.entries中的最终条目)
CompleteStory(故事:entry.key,图像:entry.value)
];
});
}
未来插入故事(可插入故事)=>插入(故事)。插入(故事);
未来更新(可插入的故事)=>更新(故事)。替换(故事);
未来删除故事(可插入的故事)=>删除(故事)。删除(故事);
}
@UseDao(表:[图像])
类ImageDao使用$ImageDaoMixin扩展DatabaseAccessor{
最终数据库数据库;
ImageDao(this.db):super(db);
Stream watchImages()=>选择(图像).watch();
未来插入图像(可插入图像)=>插入(图像)。插入(图像);
}
但是,当我尝试在我的streamBulder
上使用时,它从未到达snap.hasData
,我猜这是因为我在终端上收到以下警告:
E/SQLiteLog(7229):(1)不明确的列名:stories.id
我尝试删除该应用程序,但没有成功。我需要使用右侧的选择
故事来反转连接条件:
select(故事)
.加入([
leftOuterJoin(storyImages,storyImages.id.equalsExp(stories.id)),
])
.手表
是否打印(groupedData.entries)代码>打印任何东西?它没有打印值,但现在是,检查我的答案。很高兴你解决了它。