2016-10-27 9 views
1

Ich habe ein UWP Projekt, das mit Sqlite Datenbank arbeitet. Ich habe sqlite-net-pcl zu meinen Referenzen hinzugefügt. Ich möchte REGEXP in select Abfrage verwenden, aber es gibt mir die no such function: REGEXP. Ich suchte den Fehler, aber die Ergebnisse sind etwa SQLiteFunction, die hier nicht definiert ist. was soll ich tun?Wie REGEXP verwendet in `SQLite-net-pcl` in UWP

Antwort

1

Am Ende ich sqlite-net-pcl von nuget nicht derjenige installiert die Universal windows extensions in ReferenceManger.

sqlite-net-pcl paket in nugget hat sqlite3_create_function methode.

SQLiteConnection con = new SQLiteConnection(@"myDB.db"); 
SQLitePCL.raw.sqlite3_create_function(con.Handle, "REGEXP", 2, null, MatchRegex); 

private void MatchRegex(sqlite3_context ctx, object user_data, sqlite3_value[] args) 
    { 
     bool isMatched = System.Text.RegularExpressions.Regex.IsMatch(SQLitePCL.raw.sqlite3_value_text(args[1]), SQLitePCL.raw.sqlite3_value_text(args[0]),RegexOptions.IgnoreCase); 
     if (isMatched) 
      SQLitePCL.raw.sqlite3_result_int(ctx, 1); 
     else 
      SQLitePCL.raw.sqlite3_result_int(ctx, 0); 
    } 

das funktioniert gut :)

+1

Wow! Habe nicht bemerkt, dass 'SQLite-net PCL' auf' SQLitePCL.raw' aufgebaut ist. 'sqlite3_create_function' Methode ist eigentlich keine Methode von' SQLite-net PCL', sondern die Methode in 'SQLitePCL.raw'. Wie auch immer, eine großartige Lösung für dieses Problem. ;) –

1

The LIKE, GLOB, REGEXP, and MATCH operators Ref:

REGEXP Der Operator ist eine spezielle Syntax für den regulären Ausdruck() Benutzer-Funktion. Keine regexp() - Benutzerfunktion ist standardmäßig definiert, daher führt die Verwendung des REGEXP-Operators normalerweise zu einer Fehlermeldung. Wenn zur Laufzeit ein application-defined SQL function namens "regexp" hinzugefügt wird, wird der Operator "X REGEXP Y" als Aufruf von "regexp (Y, X)" implementiert.

Um REGEXP zu verwenden, müssen wir in der Lage sein, benutzerdefinierte Funktionen zu erstellen. Und SQLiteFunction ist die Klasse, die entwickelt wurde, um benutzerdefinierte Funktionen einfach in System.Data.SQLite zu behandeln. System.Data.SQLite ist jedoch ein ADO.NET-Provider für SQLite, der in UWP-Apps nicht verwendet werden kann.

In SQLite-net PCL gibt es keine solche Methode. SQLite-net PCL verwendet jedoch SQLitePCL.raw darunter, das ist ein sehr dünner C# -Wrapper um die C-API für SQLite und bietet einfachen (rohen) Zugriff auf SQLite. Mit SQLitePCL.raw können wir benutzerdefinierte Funktionen als was in @ Maryams Antwort erstellen.

0

Wenn Sie so etwas wie SQLite PCL Recht verwenden können, können Sie wie folgt vorgehen (mit anderen PCLs arbeiten, nicht sicher, obwohl):

using System; 
using SQLitePCL.pretty; 
using System.Text.RegularExpressions; 

namespace TestSqlite 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Func<ISQLiteValue, ISQLiteValue, ISQLiteValue> regexFunc = 
         (ISQLiteValue val, ISQLiteValue regexStr) => 
         { 
          if (Regex.IsMatch(Convert.ToString(val), Convert.ToString(regexStr))) 
           return true.ToSQLiteValue(); 
          return false.ToSQLiteValue(); 
         }; 
      SQLitePCL.Batteries.Init(); 
      SQLiteDatabaseConnection _dbcon = SQLiteDatabaseConnectionBuilder 
         .InMemory 
         .WithScalarFunc("REGEXP", regexFunc) 
         .Build(); 
      string sql = "CREATE TABLE foo (a int, b text);"; 
      _dbcon.ExecuteAll(sql); 
      _dbcon.ExecuteAll(@"INSERT INTO foo VALUES (1, 'this is me'); 
           INSERT INTO foo VALUES (2, 'that is me'); 
           INSERT INTO foo VALUES (3, 'he is me');"); 
      sql = "SELECT * FROM foo where '\\w{4} is me' REGEXP b;"; 
      foreach (var row in _dbcon.Query(sql)) { Console.WriteLine(row[1].ToString()); } 
     } 
    } 
}