小编Jon*_*nas的帖子

在同一个数据库上使用两个 FMDB 队列(读/写)

我相信我的用例相当普遍,但我找不到对此的权威答案。

我有一个在后台运行并将数据写入我的数据库的同步机制。这种同步可能需要很长时间(我使用 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)

sqlite objective-c fmdb ios

4
推荐指数
1
解决办法
2701
查看次数

添加元素后刷新ListView

我对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但事实并非如此.我是否误解了这个概念,列表不可能刷新?否则,我可能做错了什么?

c# data-binding microsoft-metro windows-runtime

3
推荐指数
1
解决办法
3774
查看次数

使用List.Contain()时Linq to SQL如何执行?

我必须从数据库中选择一些项目.项目的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

c# linq linq-to-sql

3
推荐指数
1
解决办法
685
查看次数

使用"as"关键字转换对象将返回null

这是我的类定义:

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),我会得到一个例外.

我希望它能起作用,因为类型是连贯的.我错过了什么?

c# casting

2
推荐指数
1
解决办法
6688
查看次数

LINQ group by property作为参数

我有一个我想用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)

请注意,在查询之后,存在通用且不关心组的代码.

c# linq

2
推荐指数
1
解决办法
4621
查看次数

更改夜间模式后刷新后台堆栈活动

在更改应用程序的夜间模式后,我已经看到了很多有关重新创建当前活动的问题和答案,但是在如何刷新后退堆栈活动方面我什么都没看到。

说我有返回堆栈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之后直接重新创建。

我很难相信,我是第一个尝试在更改夜间模式后从后台刷新“活动”的人。我错过了什么?

谢谢!

android android-theme kotlin android-night-mode

2
推荐指数
1
解决办法
843
查看次数