2016-10-27 6 views
1

Sqliteデータベースで動作するUWPプロジェクトがあります。私は参考にsqlite-net-pclを追加しました。 をselectというクエリで使用しますが、それは私にno such function: REGEXPを与えます。 エラーを検索しましたが、結果は約SQLiteFunctionで、ここでは定義されていません。 どうすればよいですか?UWPの `sqlite-net-pcl`にREGEXPを使用する方法

答えて

1

終わりに私は1つでnugetからsqlite-net-pclをインストールされていませんReferenceMangerのUniversal windows extensions

sqlite-net-pclパッケージには、sqlite3_create_functionメソッドがあります。

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); 
    } 

この作品罰金:)

+1

うわー! 'SQLite-net PCL'が' SQLitePCL.raw'上に構築されていることに気付かなかった。 'sqlite3_create_function'メソッドは' SQLite-net PCL'のメソッドではなく、 'SQLitePCL.raw'のメソッドです。とにかく、この問題の素晴らしい解決策です。 ;) –

1

文献The LIKE, GLOB, REGEXP, and MATCH operators

REGEXP演算子は、正規表現()ユーザ機能のための特別な構文です。 regexp()ユーザー関数はデフォルトでは定義されていないため、REGEXP演算子を使用すると通常はエラーメッセージが表示されます。 "regexp"という名前のapplication-defined SQL functionが実行時に追加された場合、 "X REGEXP Y"演算子は "regexp(Y、X)"の呼び出しとして実装されます。

REGEXPを使用するには、ユーザー定義関数を作成する必要があります。 SQLiteFunctionは、System.Data.SQLiteで簡単にユーザー定義関数を処理するように設計されたクラスです。しかし、System.Data.SQLiteはUWPアプリケーションでは使用できないSQLite用のADO.NETプロバイダです。

SQLite-net PCLには、このような方法はありません。しかし、SQLite-net PCLは、下にSQLitePCL.rawを使用しています。これは、SQLite用のC APIを中心とした非常に細いC#ラッパーであり、SQLiteへのローレベル(未処理)アクセスを提供します。 SQLitePCL.rawでは、@ Maryamの答えと同じようにユーザー定義関数を作成できます。あなたはかなりSQLiteのPCLのようなものを使用することができる場合は、次の操作を行うことができます

0

(ただし他のPCL、いないことを確認して働くことができる):

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()); } 
     } 
    } 
} 
関連する問題