1

我遇到了LoaderManager的问题。我在 sqlite 数据库中有一些表,也有表示视图,它从表中获取数据。

我也实现了 LoaderManager,就像在那个优秀的指南中一样,它非常适合桌子。

但我想更新一个表,而不是从它获取更新结果,而是从与更新表相关的 sqlite 视图获取更新结果。在这种情况下,LoaderManager 似乎不起作用(未触发 onLoadFinished 回调)

我更新的表架构:

 CREATE TABLE [table_scan] (
   [_id] INTEGER PRIMARY KEY AUTOINCREMENT,
   [NR_ID] INTEGER NOT NULL,
   [T_ID] INTEGER NOT NULL,
   [Color_ID] INTEGER NOT NULL,
   [R_ID] INTEGER NOT NULL,
   [Barcode] TEXT NOT NULL,
   [NumberSeat] INTEGER,
   [Date] DATETIME NOT NULL DEFAULT(DATETIME('now', 'localtime')),
   [Deleted] INTEGER NOT NULL DEFAULT '0',
   [Status] INTEGER NOT NULL DEFAULT '0',
   [Export] INTEGER NOT NULL DEFAULT '0');

我的sqlite视图:

CREATE VIEW [view_scan] AS SELECT _id, Barcode, Status, Deleted, NumberSeat,
 goods_catalog.T_Articul, colors_catalog.Color_Name, sizes_catalog.R_Name
 FROM table_scan
   INNER JOIN goods_catalog ON goods_catalog.T_ID = table_scan.T_ID
   INNER JOIN colors_catalog ON colors_catalog.Color_ID = table_scan.Color_ID
   INNER JOIN sizes_catalog ON sizes_catalog.R_ID = table_scan.R_ID
 WHERE Deleted = 0;
4

2 回答 2

1

像下面这样很容易做到,无需使用触发器!

public Cursor query(...) {
    ...
    case view_scan
    ...

    cursor.setNotificationUri(resolver, AUTHORITY_URI);
}
public Uri insert(Uri uri, ContentValues values) {
    ...
    case table_scan:
    ...
    cursor.setNotificationUri(resolver, AUTHORITY_URI);
}
于 2015-01-20T13:19:05.677 回答
0

找到了解决方法。不是很干净,但有效:

LoaderManager init 和更新数据的 Uris 必须相等。所以,我们需要更新视图。我们可以为此创建触发器。

首先,修改视图以获取所有需要的列:

CREATE VIEW [view_scan] AS SELECT
  table_scan._id, table_scan.NR_ID, 
  table_scan.T_ID,table_scan.Color_ID,
  table_scan.R_ID, table_scan.Barcode,
  table_scan.NumberSeat, table_scan.Deleted, 
  table_scan.Status,
  goods_catalog.T_Articul,
  colors_catalog.Color_Name,
  sizes_catalog.R_Name
FROM table_scan
 INNER JOIN goods_catalog ON goods_catalog.T_ID = table_scan.T_ID
 INNER JOIN colors_catalog ON colors_catalog.Color_ID = table_scan.Color_ID
 INNER JOIN sizes_catalog ON sizes_catalog.R_ID = table_scan.R_ID
WHERE Deleted = 0;

接下来,为 view_scan 创建触发器:

CREATE TRIGGER insert_view_scan
  instead of insert on view_scan 
   begin
    insert into table_scan(NR_ID,T_ID,Color_ID,R_ID,Barcode,NumberSeat,Status)
    values(new.NR_ID, new.T_ID, new.Color_ID, new.R_ID, new.Barcode, new.NumberSeat, new.Status);
   end;

现在,我们可以将数据更新到view_scan而不是table_scan并且 LoaderManager 工作正常。

于 2013-12-10T06:25:20.927 回答