Объявление собственных функций в SQLite3

This commit is contained in:
Ivan Nikitin 2014-05-20 18:27:08 +04:00
parent ff98ecc5ad
commit 3970f394b0
15 changed files with 682 additions and 0 deletions

3
.gitignore vendored
View File

@ -1,3 +1,6 @@
# Dependencies
Components/
# Build Folders (you can keep bin if you'd like, to store dlls and pdbs)
[Bb]in/
[Oo]bj/

View File

@ -0,0 +1,32 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQLiteExtensions_iOS", "iOS\SQLiteExtensions_iOS.csproj", "{50EEF6C9-7587-4094-8161-0F926975A307}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|iPhoneSimulator = Debug|iPhoneSimulator
Release|iPhoneSimulator = Release|iPhoneSimulator
Debug|iPhone = Debug|iPhone
Release|iPhone = Release|iPhone
Ad-Hoc|iPhone = Ad-Hoc|iPhone
AppStore|iPhone = AppStore|iPhone
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{50EEF6C9-7587-4094-8161-0F926975A307}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
{50EEF6C9-7587-4094-8161-0F926975A307}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
{50EEF6C9-7587-4094-8161-0F926975A307}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
{50EEF6C9-7587-4094-8161-0F926975A307}.AppStore|iPhone.Build.0 = AppStore|iPhone
{50EEF6C9-7587-4094-8161-0F926975A307}.Debug|iPhone.ActiveCfg = Debug|iPhone
{50EEF6C9-7587-4094-8161-0F926975A307}.Debug|iPhone.Build.0 = Debug|iPhone
{50EEF6C9-7587-4094-8161-0F926975A307}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{50EEF6C9-7587-4094-8161-0F926975A307}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{50EEF6C9-7587-4094-8161-0F926975A307}.Release|iPhone.ActiveCfg = Release|iPhone
{50EEF6C9-7587-4094-8161-0F926975A307}.Release|iPhone.Build.0 = Release|iPhone
{50EEF6C9-7587-4094-8161-0F926975A307}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{50EEF6C9-7587-4094-8161-0F926975A307}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = iOS\SQLiteExtensions_iOS.csproj
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,32 @@
using System;
namespace Touchin.SQLiteExtensions
{
public class Place
{
public int Id { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public double Distance { get; set; }
public string GetHumanReadableCoordinate()
{
return
GetHumanReadableDegrees (Math.Abs (Latitude)) + (Latitude < 0 ? "S" : "N")
+ ", " +
GetHumanReadableDegrees (Math.Abs (Longitude)) + (Longitude < 0 ? "W" : "E");
}
private string GetHumanReadableDegrees (double value)
{
var degrees = Math.Truncate (value);
var minutes = Math.Truncate ((value - degrees) * 60);
var seconds = (((value - degrees) * 60) - minutes) * 60;
return String.Format ("{0:00}\u00B0{1:00}\u2032{2:00}\u2033", degrees, minutes, seconds);
}
}
}

View File

@ -0,0 +1,46 @@
using System;
using System.Linq;
using SQLite;
namespace Touchin.SQLiteExtensions
{
public class PlaceService : IDisposable
{
private readonly SQLiteConnection _databaseConnection;
public PlaceService (string databasePath)
{
_databaseConnection = new SQLiteConnection (databasePath);
_databaseConnection.CreateDistanceFunction ();
}
public Place[] GetPlaces(double latitude, double longitude)
{
const string query = @"
SELECT *, DISTANCE(Latitude, Longitude, @latitude, @longitude) AS Distance
FROM Place
WHERE Distance < @radius
ORDER BY Distance
";
var command = _databaseConnection.CreateCommand (query);
command.Bind ("@latitude", latitude);
command.Bind ("@longitude", longitude);
command.Bind ("@radius", 100d);
return command.ExecuteDeferredQuery<Place> ().ToArray ();
}
public int GetPlaceCount()
{
const string query = @"
SELECT COUNT(*) FROM Place
";
return _databaseConnection.ExecuteScalar<int> (query);
}
public void Dispose ()
{
_databaseConnection.Dispose ();
}
}
}

View File

@ -0,0 +1,52 @@
using System;
using System.Runtime.InteropServices;
using SQLite;
namespace Touchin.SQLiteExtensions
{
public static partial class SQLite3Extensions
{
public static void CreateDistanceFunction (this SQLiteConnection connection)
{
connection.CreateFunction ("DISTANCE", 4, DistanceBody);
}
private static double Distance (double latitude1, double longitude1, double latitude2, double longitude2)
{
const double earthRadius = 6378.1;
double lat1 = latitude1 * Math.PI / 180;
double lon1 = longitude1 * Math.PI / 180;
double lat2 = latitude2 * Math.PI / 180;
double lon2 = longitude2 * Math.PI / 180;
return earthRadius * Math.Acos (Math.Sin (lat1) * Math.Sin (lat2) + Math.Cos (lat1) * Math.Cos (lat2) * Math.Cos (lon2 - lon1));
}
#if __IOS__
// https://bugzilla.novell.com/show_bug.cgi?id=576775
[MonoTouch.MonoPInvokeCallback (typeof (Action<IntPtr, int, IntPtr>))]
#endif
private static void DistanceBody (IntPtr ctx, int argc, IntPtr argv)
{
IntPtr[] args = ExtractArgs (argc, argv);
if (ValueType (args [0]) != SQLite3.ColType.Float ||
ValueType (args [1]) != SQLite3.ColType.Float ||
ValueType (args [2]) != SQLite3.ColType.Float ||
ValueType (args [3]) != SQLite3.ColType.Float)
{
ResultNull (ctx);
}
else
{
double latitude1 = ValueDouble (args [0]);
double longitude1 = ValueDouble (args [1]);
double latitude2 = ValueDouble (args [2]);
double longitude2 = ValueDouble (args [3]);
double result = Distance (latitude1, longitude1, latitude2, longitude2);
ResultDouble (ctx, result);
}
}
}
}

View File

@ -0,0 +1,82 @@
using System;
using System.Runtime.InteropServices;
using SQLite;
namespace Touchin.SQLiteExtensions
{
public static partial class SQLite3Extensions
{
private static void CreateFunction (this SQLiteConnection connection, string functionName, int paramCount, Action<IntPtr, int, IntPtr> functionBody)
{
var result = CreateFunction (connection.Handle, functionName, paramCount, TextEncoding.UTF8, IntPtr.Zero, functionBody, null, null);
if (result != SQLite3.Result.OK)
{
throw SQLiteException.New (result, "Can not create function");
}
}
private static IntPtr [] ExtractArgs (int argc, IntPtr argv)
{
IntPtr [] args = new IntPtr [argc];
Marshal.Copy (argv, args, 0, argc);
return args;
}
// SQLITE_API int sqlite3_create_function(
// sqlite3 *db,
// const char *zFunctionName,
// int nArg,
// int eTextRep,
// void *pApp,
// void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
// void (*xStep)(sqlite3_context*,int,sqlite3_value**),
// void (*xFinal)(sqlite3_context*)
// );
[DllImport("sqlite3", CallingConvention = CallingConvention.Cdecl, EntryPoint = "sqlite3_create_function")]
private static extern SQLite3.Result CreateFunction (
IntPtr db,
string zFunctionName,
int nArg,
TextEncoding eTextRep,
IntPtr pApp,
Action<IntPtr, int, IntPtr> xFunc,
Action<IntPtr, int, IntPtr> xStep,
Action<IntPtr, int, IntPtr> xFinal
);
#region sqlite3_value
// SQLITE_API int sqlite3_value_type(sqlite3_value*);
[DllImport("sqlite3", CallingConvention = CallingConvention.Cdecl, EntryPoint = "sqlite3_value_type")]
private static extern SQLite3.ColType ValueType (IntPtr value);
// SQLITE_API double sqlite3_value_double(sqlite3_value*);
[DllImport("sqlite3", CallingConvention = CallingConvention.Cdecl, EntryPoint = "sqlite3_value_double")]
private static extern double ValueDouble (IntPtr value);
#endregion
#region sqlite3_context
// SQLITE_API void sqlite3_result_null(sqlite3_context*);
[DllImport("sqlite3", CallingConvention = CallingConvention.Cdecl, EntryPoint = "sqlite3_result_null")]
private static extern void ResultNull (IntPtr ctx);
// SQLITE_API void sqlite3_result_double(sqlite3_context*, double);
[DllImport("sqlite3", CallingConvention = CallingConvention.Cdecl, EntryPoint = "sqlite3_result_double")]
private static extern void ResultDouble (IntPtr ctx, double value);
#endregion
// These constant define integer codes that represent the various text encodings supported by SQLite.
private enum TextEncoding
{
UTF8 = 1,
UTF16LE = 2,
UTF16BE = 3,
UTF16 = 4, /* Use native byte order */
Any = 5, /* sqlite3_create_function only */
UTF16Aligned = 8, /* sqlite3_create_collation only */
}
}
}

View File

@ -0,0 +1,31 @@
using MonoTouch.Foundation;
using MonoTouch.UIKit;
namespace Touchin.SQLiteExtensions
{
[Register (Name)]
public partial class AppDelegate : UIApplicationDelegate
{
private const string Name = "AppDelegate";
UIWindow _window;
UIViewController _viewController;
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
_window = new UIWindow (UIScreen.MainScreen.Bounds);
_viewController = new MainViewController ();
_window.RootViewController = new UINavigationController (_viewController);
_window.MakeKeyAndVisible ();
return true;
}
private static void Main (string[] args)
{
UIApplication.Main (args, null, Name);
}
}
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
</dict>
</plist>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>SQLiteExtensions</string>
<key>CFBundleIdentifier</key>
<string>com.touchin.sqlite-extensions</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>MinimumOSVersion</key>
<string>6.0</string>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>XSLaunchImageAssets</key>
<string>Resources/Images.xcassets/LaunchImage.launchimage</string>
</dict>
</plist>

View File

@ -0,0 +1,83 @@
using System;
using System.Diagnostics;
using System.Linq;
using MonoTouch.CoreLocation;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using SQLite;
namespace Touchin.SQLiteExtensions
{
public class MainViewController : UITableViewController
{
private readonly PlaceService _placeService;
private readonly CLLocationManager _locationManager;
private readonly Stopwatch _stopwatch;
private int _totalCount;
private Place[] _places;
public MainViewController ()
{
Title = "SQLite Extensions";
var databasePath = NSBundle.MainBundle.PathForResource ("Place", "sqlite");
_placeService = new PlaceService (databasePath);
_locationManager = new CLLocationManager();
_stopwatch = new Stopwatch ();
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
TableView.AllowsSelection = false;
}
public override void ViewWillAppear (bool animated)
{
base.ViewWillAppear (animated);
_totalCount = _placeService.GetPlaceCount ();
if (CLLocationManager.LocationServicesEnabled)
{
_locationManager.LocationsUpdated += HandleLocationsUpdated;
_locationManager.StartUpdatingLocation ();
}
}
private void HandleLocationsUpdated (object sender, CLLocationsUpdatedEventArgs e)
{
var location = e.Locations.Last ();
_stopwatch.Restart ();
_places = _placeService.GetPlaces (location.Coordinate.Latitude, location.Coordinate.Longitude);
_stopwatch.Stop ();
TableView.ReloadData ();
}
public override int RowsInSection (UITableView tableview, int section)
{
return _places != null ? _places.Length : 0;
}
public override string TitleForHeader (UITableView tableView, int section)
{
return String.Format ("Places ({0}/{1}) : {2} ms", RowsInSection (tableView, section), _totalCount, _stopwatch.ElapsedMilliseconds);
}
public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
{
var reuseIdentifier = "Touchin.SQLiteExtensions.MainViewController.PlaceCell";
var cell = tableView.DequeueReusableCell (reuseIdentifier) ?? new UITableViewCell (UITableViewCellStyle.Value1, reuseIdentifier);
var place = _places [indexPath.Row];
cell.TextLabel.Text = place.GetHumanReadableCoordinate ();
cell.DetailTextLabel.Text = String.Format ("{0:F3} km", place.Distance);
return cell;
}
}
}

View File

@ -0,0 +1,140 @@
{
"images": [
{
"minimum-system-version": "7.0",
"orientation": "portrait",
"extent": "full-screen",
"filename": "Default@2x.png",
"size": "640x960",
"scale": "2x",
"idiom": "iphone"
},
{
"minimum-system-version": "7.0",
"orientation": "portrait",
"extent": "full-screen",
"filename": "Default-568h@2x.png",
"size": "640x1136",
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"minimum-system-version": "7.0",
"orientation": "portrait",
"extent": "full-screen",
"size": "768x1024",
"scale": "1x",
"idiom": "ipad"
},
{
"minimum-system-version": "7.0",
"orientation": "portrait",
"extent": "full-screen",
"size": "1536x2048",
"scale": "2x",
"idiom": "ipad"
},
{
"minimum-system-version": "7.0",
"orientation": "landscape",
"extent": "full-screen",
"size": "1024x768",
"scale": "1x",
"idiom": "ipad"
},
{
"minimum-system-version": "7.0",
"orientation": "landscape",
"extent": "full-screen",
"size": "2048x1536",
"scale": "2x",
"idiom": "ipad"
},
{
"orientation": "portrait",
"extent": "full-screen",
"filename": "Default.png",
"size": "320x480",
"scale": "1x",
"idiom": "iphone"
},
{
"orientation": "portrait",
"extent": "full-screen",
"filename": "Default@2x.png",
"size": "640x960",
"scale": "2x",
"idiom": "iphone"
},
{
"orientation": "portrait",
"extent": "full-screen",
"filename": "Default-568h@2x.png",
"size": "640x1136",
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"orientation": "portrait",
"extent": "full-screen",
"size": "768x1024",
"scale": "1x",
"idiom": "ipad"
},
{
"orientation": "portrait",
"extent": "full-screen",
"size": "1536x2048",
"scale": "2x",
"idiom": "ipad"
},
{
"orientation": "portrait",
"extent": "to-status-bar",
"size": "768x1004",
"scale": "1x",
"idiom": "ipad"
},
{
"orientation": "portrait",
"extent": "to-status-bar",
"size": "1536x2008",
"scale": "2x",
"idiom": "ipad"
},
{
"orientation": "landscape",
"extent": "full-screen",
"size": "1024x768",
"scale": "1x",
"idiom": "ipad"
},
{
"orientation": "landscape",
"extent": "full-screen",
"size": "2048x1536",
"scale": "2x",
"idiom": "ipad"
},
{
"orientation": "landscape",
"extent": "to-status-bar",
"size": "1024x748",
"scale": "1x",
"idiom": "ipad"
},
{
"orientation": "landscape",
"extent": "to-status-bar",
"size": "2048x1496",
"scale": "2x",
"idiom": "ipad"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

View File

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">iPhoneSimulator</Platform>
<ProductVersion>10.0.0</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{50EEF6C9-7587-4094-8161-0F926975A307}</ProjectGuid>
<ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<OutputType>Exe</OutputType>
<RootNamespace>Touchin.SQLiteExtensions</RootNamespace>
<IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\iPhoneSimulator\Debug</OutputPath>
<DefineConstants>DEBUG;__MOBILE__;__IOS__;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<MtouchLink>None</MtouchLink>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchDebug>true</MtouchDebug>
<AssemblyName>SQLiteExtensions</AssemblyName>
<MtouchI18n>
</MtouchI18n>
<MtouchArch>ARMv7</MtouchArch>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhoneSimulator\Release</OutputPath>
<DefineConstants>__MOBILE__;__IOS__;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<MtouchLink>None</MtouchLink>
<ConsolePause>false</ConsolePause>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<AssemblyName>SQLiteExtensions</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhone' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\iPhone\Debug</OutputPath>
<DefineConstants>DEBUG;__MOBILE__;__IOS__;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchDebug>true</MtouchDebug>
<CodesignKey>iPhone Developer</CodesignKey>
<AssemblyName>SQLiteExtensions_iOS</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhone\Release</OutputPath>
<DefineConstants>__MOBILE__;__IOS__;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<ConsolePause>false</ConsolePause>
<CodesignKey>iPhone Developer</CodesignKey>
<AssemblyName>SQLiteExtensions_iOS</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Ad-Hoc|iPhone' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhone\Ad-Hoc</OutputPath>
<DefineConstants>__MOBILE__;__IOS__;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<BuildIpa>true</BuildIpa>
<CodesignProvision>Automatic:AdHoc</CodesignProvision>
<CodesignKey>iPhone Distribution</CodesignKey>
<AssemblyName>SQLiteExtensions_iOS</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'AppStore|iPhone' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhone\AppStore</OutputPath>
<DefineConstants>__MOBILE__;__IOS__;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<CodesignProvision>Automatic:AppStore</CodesignProvision>
<CodesignKey>iPhone Distribution</CodesignKey>
<AssemblyName>SQLiteExtensions_iOS</AssemblyName>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="monotouch" />
<Reference Include="SQLite">
<HintPath>..\Components\sqlite-net-1.0.1\lib\ios\SQLite.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="Info.plist" />
<None Include="Entitlements.plist" />
</ItemGroup>
<ItemGroup>
<Compile Include="AppDelegate.cs" />
<Compile Include="..\Shared\SQLite3Extensions.cs">
<Link>SQLite3Extensions.cs</Link>
</Compile>
<Compile Include="..\Shared\SQLite3Extensions.Distance.cs">
<Link>SQLite3Extensions.Distance.cs</Link>
</Compile>
<Compile Include="MainViewController.cs" />
<Compile Include="..\Shared\Place.cs">
<Link>Place.cs</Link>
</Compile>
<Compile Include="..\Shared\PlaceService.cs">
<Link>PlaceService.cs</Link>
</Compile>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<ImageAsset Include="Resources\Images.xcassets\LaunchImage.launchimage\Contents.json" />
<ImageAsset Include="Resources\Images.xcassets\LaunchImage.launchimage\Default-568h%402x.png" />
<ImageAsset Include="Resources\Images.xcassets\LaunchImage.launchimage\Default%402x.png" />
<ImageAsset Include="Resources\Images.xcassets\LaunchImage.launchimage\Default.png" />
</ItemGroup>
<ItemGroup>
<XamarinComponentReference Include="sqlite-net">
<Version>1.0.1</Version>
<Visible>False</Visible>
</XamarinComponentReference>
</ItemGroup>
<ItemGroup>
<BundleResource Include="..\Shared\Place.sqlite">
<Link>Resources\Place.sqlite</Link>
</BundleResource>
</ItemGroup>
</Project>