我相信我的用例相当普遍,但我找不到对此的权威答案。
我有一个在后台运行并将数据写入我的数据库的同步机制。这种同步可能需要很长时间(我使用 FTS)。为此,我使用FMDatabaseQueue. 当我想读取数据库时,我使用相同的队列进行查询。
现在,当同步进程已经将大量事务排队到队列中时,应用程序想要进行读取,它必须等待所有写入事务完成才能进行查询,因为这是一个串行队列。代码可能如下所示:
FMDatabaseQueue *queue = [self getDatabaseQueue];
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
    // Very slow process
    [db executeUpdate:@"UPDATE docs SET name = ?", "value..."];
}];
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
    // Very slow process
    [db executeUpdate:@"UPDATE docs SET name = ?", "value..."];
}];
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
    // Very slow process
    [db executeUpdate:@"UPDATE docs SET name = ?", "value..."];
}];
[queue inDatabase:^(FMDatabase *db) {
    FMResultSet *resultSet = [db executeQuery:@"SELECT name..."];
}]; …Run Code Online (Sandbox Code Playgroud) 我对Windows开发很新,当然甚至更新的Metro风格的应用程序开发.我不确定我理解数据绑定是如何工作的.
我有一个项目清单.
private List<Expense> _expenses = new List<Expense>();
public List<Expense> Items
{
    get
    {
        return this._expenses;
    }
}
Run Code Online (Sandbox Code Playgroud)
我绑定到XAML.(我使用拆分页面模板)
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        this.DefaultViewModel["Items"] = _data.Items;
    }
Run Code Online (Sandbox Code Playgroud)
然后我显示它
<UserControl.Resources>
    <CollectionViewSource
        x:Name="itemsViewSource"
        Source="{Binding Items, Mode=TwoWay}"/>
</UserControl.Resources>
<ListView
    x:Name="itemListView"
    AutomationProperties.AutomationId="ItemsListView"
    AutomationProperties.Name="Items"
    Margin="120,0,0,60"
    ItemsSource="{Binding Source={StaticResource itemsViewSource}}"
    SelectionChanged="ItemListView_SelectionChanged"
    ItemTemplate="{StaticResource DefaultListItemTemplate}"/>
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.然后当用户点击按钮时,我将新项目添加到我的列表中
_data.Items.Add(new Expense
{
    Total = 100,
    When = new DateTime(2013, 6, 6),
    For = "Myself"
});
Run Code Online (Sandbox Code Playgroud)
我期待ListView自我设置以来会自动刷新,Mode=TwoWay但事实并非如此.我是否误解了这个概念,列表不可能刷新?否则,我可能做错了什么?
我必须从数据库中选择一些项目.项目的ID在a中List.
在这里的答案中,Jon Skeet表示我们可能会使用Contains()
var foo = channel.AsQueryable<CodeData>()
                 .Where(codeData => codeIDs.Contains(codeData.CodeId));
Run Code Online (Sandbox Code Playgroud)
在数据库庞大且ID列表非常小的环境中,它的性能如何?
Linq是否足够聪明,可以IN在SQL中使用该子句?
编辑:我正在使用DataContext和SQL Server 2008
这是我的类定义:
public abstract class AbstractEntity : ...
public partial class AbstractContactEntity : AbstractEntity, ...
public sealed class EntityCollectionProxy<T> : IList<T>, System.Collections.IList 
where T : AbstractEntity
Run Code Online (Sandbox Code Playgroud)
现在我从委托中获取了一个对象,并且我希望将其强制转换,并且它不会像我期望的那样工作.
var obj = resolver.DynamicInvoke (this.entity);
var col = obj as EntityCollectionProxy<AbstractEntity>;
Run Code Online (Sandbox Code Playgroud)
obj是类型的EntityCollectionProxy<AbstractContactEntity>.
但是col没有.如果我尝试常规投射(var col = (Entity...) obj),我会得到一个例外.
我希望它能起作用,因为类型是连贯的.我错过了什么?
我有一个我想用LINQ查询的对象列表.我希望能够通过财产对它们进行分组.
var query = from item in expense
    orderby item.ExpenseTime descending
    group item by item.Location;
var query = from item in expense
    orderby item.ExpenseTime descending
    group item by item.ExpenseType;
var query = from item in expense
    orderby item.ExpenseTime descending
    group item by item.Person;
Run Code Online (Sandbox Code Playgroud)
有没有办法将属性指定为方法的参数?
public static void GetExpensesBy(List<Expense> expense, Property myGroupingProperty)
{
    var query = from item in expense
                orderby item.ExpenseTime descending
                group item by item.myGroupingProperty;
    // ....
}
Run Code Online (Sandbox Code Playgroud)
请注意,在查询之后,存在通用且不关心组的代码.
在更改应用程序的夜间模式后,我已经看到了很多有关重新创建当前活动的问题和答案,但是在如何刷新后退堆栈活动方面我什么都没看到。
说我有返回堆栈A> B> C。活动C允许通过调用更改夜间模式AppCompatDelegate.setDefaultNightMode()。调用之后,当前活动(C)可以使用delegate.applyDayNight()或刷新其主题recreate()。
但是,当用户导航回B或A时,无论白天还是晚上,活动仍在使用“旧”模式。
我试图在活动中添加类似的内容:
override fun onResume() {
  super.onResume()
  delegate.applyDayNight()
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。
我做了多次尝试来解决这个问题:
一种想法是完全按照此处或此处的建议重新创建后堆栈,但是由于后堆栈不是静态的,因此对我而言这是不可行的。
另一个想法是让一个类处理夜间模式更改并提供LiveData。每个Activity都会监听LiveData进行模式更改并调用recreate()。但是,我们陷入了无限循环,因为活动将在开始收听LiveData之后直接重新创建。
我很难相信,我是第一个尝试在更改夜间模式后从后台刷新“活动”的人。我错过了什么?
谢谢!
c# ×4
linq ×2
android ×1
casting ×1
data-binding ×1
fmdb ×1
ios ×1
kotlin ×1
linq-to-sql ×1
objective-c ×1
sqlite ×1