2017-04-04 53 views
0

有没有办法从代码中缩小数据库?我在我的数据库中发现一些表损坏了:如何从代码中检测到并修复它?Xamarin和SQLite:修复损坏的数据库和缩小

当我尝试使用Execute更新特定表中的记录时,我总是收到一个Corrupt错误。

表的定义是

[Table("tbl_Colour")] 
public class Colour : BaseTableListing { 
} 

public class BaseTableListing : ITableEntity 
{ 
    [PrimaryKey, AutoIncrement] 
    [Indexed] 
    public int Id { get; set; } = 0; 

    public string CreatedBy { get; set; } = ""; 

    public DateTime CreatedDate { get; set; } = DateTime.Now; 

    // more fields 
    // ... 
} 

查询是

UPDATE tbl_Colour SET IsUpdated = 0, 
SynchronizeDate=CAST((((JulianDay('2017-04-04 09:22:12', 'localtime') 
    - 2440587.5)*86400.0) + 62135596800) * 10000000 AS BIGINT) 
WHERE ID = 57; 

预先感谢您。

回答

0

的命令收缩源码文件真空https://sqlite.org/lang_vacuum.html

它重建的文件,所以也许可以解决你的问题。

+0

感谢您的留言 – Enrico

+0

我发现了另一个命令'integrity_check',但我不知道我怎样才能从调用它'CreateCommand' – Enrico

0

我的解决办法是这样的地方database如果您在您的解决方案或项目数据库:

/// <summary> 
/// Compacts the database. 
/// </summary> 
public void CompactDatabase() 
{ 
    try 
    { 
     SQLiteCommand cmd = database.CreateCommand("vacuum"); 
     cmd.ExecuteNonQuery(); 
    } 
    catch (Exception ex) 
    { 
     Debug.WriteLine("CompactDatabase has an error: " + ex.Message); 

     // if you use MobileCenter 
     Analytics.TrackEvent("CompactDb Error", new Dictionary<string, string> { 
      { "Message", ex.Message }, 
      { "Source", ex.Source }, 
      { "StackTrace", ex.StackTrace.ToString() } 
     }); 
    } 
} 
+0

确切地说,真空是一个正常的命令,你可以执行它作为每个命令。我认为它可以解决你的问题。 –