Professional Documents
Culture Documents
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics| qmatteoq.com
qmatteoq.com 4
2013,Jun
39 Comments Respond
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics
in Windows 8, Windows Phone , by qmatteoq
search something
SEARCH
Recent Posts
New reduced price to become a Windows Phone developer App Studio: lets take a look at a generated project App Studio: lets create our first application! App Studio: a new tool by Microsoft for Windows Phone developers New SDK update for Windows Phone 8
One of the topics that gathered more attention on my blog is SQLite: developing an application without the need to store, somehow, the data locally is almost impossible, so developers are always searching the best way to achieve this objective. SQLite is one of the most interesting solutions out there, since its open source and its available for almost every platform on the market (mobile, web, client, etc.). Ive already talked you about sqlite-net, a library that is available for Windows Phone 8 and Windows 8 that can be used to perform operations on a SQLite database using a high level API that support LINQ operations. This library is very simple to use, but it has some limitations: the biggest one is that doesnt support relationships out of the box. Now Peter Torr (a member of the Windows Phone development team in Microsoft) with the support of Andy Wigley (a former Windows Phone Development MVP that now has joined Microsoft) have released on Codeplex a new SQLite wrapper, that is totally different from sqlite-net and that satisfies another type of approach: total control. In fact, this new wrapper doesnt support any LINQ operation but only manual SQL statement: the biggest pro is that you can perform any type of operation, even managing relationships. The biggest cons is that youll have to rely on old plain SQL queries to do any operation, even the simplest ones, like creating a table or inserting some data. Lets see, step by step, how to use it and how the approach is different from using sqlite-net. In this first post were going to see the basics, in the next one well talk about relationships.
Recent Comments
qmatteoq on A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics qmatteoq on How to display GIF images in a Windows Phone application qmatteoq on First steps with Caliburn Micro in Windows Phone 8 The first project Mahipatsinh on Working with SQLite in Windows Phone 8: a sqlite-net version for mobile Mayank Gupta on A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics
Archives
August 2013 July 2013 June 2013 May 2013 April 2013 March 2013 February 2013 January 2013 December 2012 November 2012 October 2012 September 2012 August 2012 July 2012 June 2012
Tag Cloud App Studio Async Azure Caliburn Database Mangopollo Maps Microsoft
MVP
Windows 8 Windows
wp.qmatteoq.com/a-new-sqlite-wrapper-for-windows-phone-8-and-windows-8-the-basics/
16/9/2556
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics| qmatteoq.com
file name. The folder is passed to the constructor using a StorageFolder object, which is the Windows Runtime class that identifies a folder in the isolated storage. In the sample, were simply using the storages root. If the database doesnt exist, it will be created; otherwise it will simply be opened. Then we can open the connection, by calling the OpenAsync() method: it accepts, eventually, a parameter to set the opening mode (like read only). If we dont set it, it will be used the default one, that supports read and write operations. Then, we go manual! As already anticipated, the wrapper doesnt support LINQ operations, so youll have to write the needed SQL statements to perform the operation. I assume that you already know the basics of SQL, so I wont describe in details the queries: in this sample we define a query to create a table called People with 3 columns: Id (which is the primary key and its an auto increment value), Name and Surname (which simply contains strings). To execute the query we call the async method ExecuteStatementAsync() on the Database object, passing as parameter the string with the query statement. ExecuteStatementAsync() is the method we need to use when the query doesnt return any value and when we dont need to define any parameter (well see later how to use them). As you can see, theres a huge difference with the sqlite-net approach: theres no mapping with a class and theres no automatic conversion to a table. Everything is made with plain SQL statements.
Categories
Developer's life Uncategorized Windows 8 Windows Phone
Awards
wp.qmatteoq.com/a-new-sqlite-wrapper-for-windows-phone-8-and-windows-8-the-basics/
2/11
16/9/2556
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics| qmatteoq.com
or more values. Lets see, for example, how to perform a select to retrieve the data weve just inserted: private async void OnGetDataClicked(object sender, RoutedEventArgs e) { Database database = new Database(ApplicationData.Current.LocalFolder, "people.db"); await database.OpenAsync(); string query = "SELECT * FROM PEOPLE"; Statement statement = await database.PrepareStatementAsync(query); while (await statement.StepAsync()) { MessageBox.Show(statement.GetTextAt(0) + " " + statement.GetTextAt(1)); } } The first part of the code is the same weve seen before: we define the query (in this case, we retrieve all the rows of the People table), we prepare a Statement and we execute it with the StepAsync() method. The difference is that, this time, the StepAsync() method is performed into a while statement: its because the method will iterate over all the rows returned by the query so, every time we enter into the while loop, a new row is retrieved. In this sample, we expect to see the MessageBox twice: one for the user Matteo Pagani and one for the user John Doe . In the sample you see also how to get the values from the results: the Statement object offers some methods that starts with the Get prefix, that accepts as parameter the column index of the value to retrieve. There are some method for the most common data types: in this sample, since both Name and Surname are strings we use the GetTextAt() method, passing 0 as index to get the name and 1 as index to get the surname. Of course we can combine what weve learned in the last two samples and, for example, we can perform a select query that contains some parameters: private async void OnGetSomeDataClicked(object sender, RoutedEventArgs e) { Database database = new Database(ApplicationData.Current.LocalFolder, "people.db"); await database.OpenAsync(); string query = "SELECT * FROM PEOPLE WHERE Name=@name"; Statement statement = await database.PrepareStatementAsync(query); statement.BindTextParameterWithName("@name", "Matteo"); while (await statement.StepAsync()) { MessageBox.Show(statement.GetTextAt(0) + " " + statement.GetTextAt(1)); } } In this sample, we retrieve from the People table only the rows where the column Name contains the value Matteo. We have also another option to access to the columns of the rows weve retrieved with a query, but its disabled by default because it slower and it returns every value as string, instead of its proper type. To enable it you have to call the EnableColumnsProperty method of the Statement object: once youve done it, you can access to the values by using the Columns property of the Statement object: its a collection and you can access to each item by using the columns name as index. Here is a sample: private async void OnGetSomeDataWithColumnsPropertyClicked(object sender, RoutedEventArgs e) { Database database = new Database(ApplicationData.Current.LocalFolder, "people.db"); await database.OpenAsync(); string query = "SELECT * FROM PEOPLE"; Statement statement = await database.PrepareStatementAsync(query); statement.EnableColumnsProperty(); while (await statement.StepAsync()) { MessageBox.Show(statement.Columns["Name"] + " " + statement.Columns["Surname"]); } }
wp.qmatteoq.com/a-new-sqlite-wrapper-for-windows-phone-8-and-windows-8-the-basics/
3/11
16/9/2556
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics| qmatteoq.com
Coming soon
In this post weve learned the basic concepts to use this new wrapper to perform operations on a SQLite database and which are the differences with another popular wrapper, sqlite-net. In the next post well see how to deal with relationships, one of the most problematic scenarios to manage nowadays. Meanwhile, you can play with the sample project. Download the sample project Tagged with: SQLite Windows 8 Windows Phone
share to
t w fi at ct e ebr o o k + t h ti h si s
Buzz
39 Responses to A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics
1.
I can see that you are specifying the folder to store the database in: Database database = new Database(ApplicationData.Current.LocalFolder, people.db); Does this mean that this wrapper allows you to save the database into, for example, the My Documents folder, something that sqlite-net cannot do? Im intrigued by this wrapper but it does seem like youve lost the power of mapping classes onto the database, or am I misunderstanding something here?
Reply
1.
qmatteoq says:
June 6, 2013 at 11:41 am
Hi Philip, honestly I havent tried, Ive played with this wrapper just with a Windows Phone 8 application, but I think it will work only if the database file is stored in the isolated storage. About the second question, youre totally right: this new wrapper works only in manual mode, with plain SQL queries. Theres no mapping with classes, there are no LINQ operations, just plain SQL statement and iteration over the results.
Reply
2.
Alex says:
June 26, 2013 at 3:49 pm
So how exactly does one decide on whether to go with sqlite-net or codeplex for a windows phone project?
Reply
1.
qmatteoq says:
June 27, 2013 at 2:38 pm
It all depends by your needs. If you have a simple app (for example, one table only) sqlite-net is much easier to use; if you need full control or you have a complex scenario (lot of tables, relationships, etc.) the new sqlite wrapper on codeplex is definitely better.
Reply
wp.qmatteoq.com/a-new-sqlite-wrapper-for-windows-phone-8-and-windows-8-the-basics/
4/11
16/9/2556
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics| qmatteoq.com
3.
prabhu says:
July 1, 2013 at 11:44 am
This database god compared to sqlite-net.In this database how to check table already created or not?
Reply
1.
qmatteoq says:
July 1, 2013 at 11:47 am
Hi, according to the SQLite documentation if you have to perform the following query: SELECT name FROM sqlite_master WHERE type=table AND name=table_name; Replace table_name with the name of the table you want to check.
Reply
1.
prabhu says:
July 1, 2013 at 12:23 pm
Hi,post my code check correct or not? this return column count=1. string test = Select name from sqlite_master where type=table and name=employeeRecord; var statement = await myDataBase.PrepareStatementAsync(test);
Reply
1.
qmatteoq says:
July 1, 2013 at 1:48 pm
I think yes, if it returns a value it means that the table exists; otherwise, the query would return no results.
Reply
1.
prabhu says:
July 1, 2013 at 2:35 pm
any time return same value .but i got solution another way while creating table itself use IF NOT EXISTS the problem will solved. sample : string createTable = create table if not exists employeeRecord + (RegNo integer primary key not null, + Name varchar(20), + City varchar(20));
wp.qmatteoq.com/a-new-sqlite-wrapper-for-windows-phone-8-and-windows-8-the-basics/
5/11
16/9/2556
4.
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics| qmatteoq.com
prabhu says:
July 1, 2013 at 2:41 pm
I will face another problem because While deleting particular row code will executed but table record is there. example code: string deleteQuery = delete from employeeRecord where RegNo=3; Statement statment = await myDataBase.PrepareStatementAsync(deleteQuery); MessageBox.Show(Deleted Successfully); this is correct or not?
Reply
1.
prabhu says:
July 1, 2013 at 3:03 pm
Sorry i got this problem i mised following commends: await statment.StepAsync(); thanks your cordination
Reply
1.
qmatteoq says:
August 4, 2013 at 7:54 pm
2.
qmatteoq says:
August 4, 2013 at 7:55 pm
5.
Derek says:
July 9, 2013 at 4:22 pm
With sqlite-net I used http://www.codeproject.com/Articles/13419/SelectQueryBuilder-Buildingcomplex-and-flexible-S to create queries. It might come in handy with this wrapper too.
Reply
6.
Neutobe says:
July 15, 2013 at 5:23 am
Is this native wrapper need biuld in arm same as sqlite-net-wp8?If so,the solution with this can not build in emulater,isnt it?
Reply
1.
qmatteoq says:
July 15, 2013 at 12:40 pm
I think yes, since its the SQLite runtime that requires two different compilations processes: one for ARM and one for X86. If you want to target the phone, youll need to build it for ARM; otherwise, if you want to deploy on the emulator, youll have to use X86.
Reply
wp.qmatteoq.com/a-new-sqlite-wrapper-for-windows-phone-8-and-windows-8-the-basics/
6/11
16/9/2556
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics| qmatteoq.com
1. Neutobe says:
July 16, 2013 at 9:12 am
2.
Neutobe says:
July 17, 2013 at 4:03 am
7.
Alex says:
July 23, 2013 at 12:26 pm
So Im finally running my project and I get WinRT information: SQL Error. And Im not even sure where the error is coming from. Any suggestions qmatteoq?
Reply
1.
Alex says:
July 25, 2013 at 8:46 pm
After a couple of code changes, now it gives a System.ArgumentException on this line: Statement readStatement = await database.PrepareStatementAsync(query); which is really weird because I cant find anything wrong with that line
Reply
8.
Ashu says:
September 2, 2013 at 10:38 am
i have downloaded your code but i am unable to find the Database wrapper class. Can you please show us Database wrapper class ? and one thing more i would like to ask during building your code i am facing following error. App.xaml The name LocalizedStrings does not exist in the namespace clr-namespace:SQLiteNew. I had downloaded Sqlite new from link given by you in tutorial. I really like your post and it will solve my so much issue. Please rectify my issues. It will be great help.
Reply
1.
qmatteoq says:
September 4, 2013 at 2:12 pm
Hi, the Database class is part of the wrapper. Make sure that youve added, in your project, a reference to both SQLiteWrapper project and SQLite runtime (the one that is installed using the Visual Studio extension).
Reply
wp.qmatteoq.com/a-new-sqlite-wrapper-for-windows-phone-8-and-windows-8-the-basics/
7/11
16/9/2556
9.
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics| qmatteoq.com
Mayank Gupta says:
September 10, 2013 at 11:45 am
How to use the Windows phone 8 project. its not mentioned anywhere in your blog
Reply
1.
qmatteoq says:
September 10, 2013 at 11:47 am
Im sorry, but what do you mean exactly? This post is about using the new SQLite wrapper with a Windows Phone 8 project.
Reply
1.
I want to know how will i use the sqlite wrapper for windows phone 8 in my app project. there are no steps mentioned on how will I include the sqlite wrapper in my project.
Reply
1.
qmatteoq says:
September 10, 2013 at 11:52 am
Hi, I guess you didnt read the post carefully The procedure is explained in the section titled Configure the wrapper.
Reply
1. says:
Mayank Gupta
I just wanted to say that, it will be difficult for a beginner to able to deduce how to add project into your solutions. For more clarity these steps can be added Right Click on you Solution>Add >Existing Project >select the SQLiteWinRTPhone.vcxproj
2.
qmatteoq says:
September 10, 2013 at 12:03 pm
Thanks for the feedback, Ill try to be more precise in the future. However, the post was targeted to developers that already has a basic development and Visual Studio knowledge: if a
wp.qmatteoq.com/a-new-sqlite-wrapper-for-windows-phone-8-and-windows-8-the-basics/
8/11
16/9/2556
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics| qmatteoq.com
developer doesnt know how to add a project to a solution, maybe there are a few steps that he should take before learning how to use SQLite in a Windows Phone app
10.
I am getting error while I am importing the SQLiteWinRTPhone.vcxproj in my app project. it says Unable to read the project file SQLiteWinRTPhone.vcxproj. Also it says The imported project C:\Program Files\Microsoft SDKs\Windows Phone\v8.0\ExtensionSDKs\SQLite.WP80\3.7.1.1\DesignTime\Common Configuration\Neutral\SQLite.QP80.props not found. The SQlite version I have downloaded for windows phone is 3.8.0.2. What to do now ?
Reply
1.
qmatteoq says:
September 10, 2013 at 12:15 pm
Unfortunately the SQLite library should match the installed SQLite runtime. You have to wait that the Codeplex project is updated or, otherwise, manually install an old SQLite runtime that matches (in your case, its 3.7.1.1).
Reply
1.
2.
I am able to include the SQLite wrapper project in my windows phone 8 app project by editing the SQLiteWinRTPhone.vcxproj and replacing the path for 3.1.17 to 3.8.0.2
Reply
1.
qmatteoq says:
September 10, 2013 at 2:58 pm
Good alternative, I was going to propose this solution since I cant find on the web the 3.7.1.1 SQLite Runtime for Windows Phone. Good catch, meanwhile Ill try to contact the wrappers team to understand if theyre planning to keep it updated.
Reply
wp.qmatteoq.com/a-new-sqlite-wrapper-for-windows-phone-8-and-windows-8-the-basics/
9/11
16/9/2556
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics| qmatteoq.com
11.
I built an app using this wrapper and when I tried to run the app on WP8 Simulator, it is giving an exception A first chance exception of type System.Reflection.TargetInvocationException occurred in mscorlib.ni.dll ion the statement await database.ExecuteStatementAsync(query);
Reply
1.
qmatteoq says:
September 12, 2013 at 9:45 am
If you have the chance, send me your project and Ill take a look.
Reply
12.
Cant we use this wrapper in a Portable Class Library for Windows Phone 8 ?
Reply
1.
qmatteoq says:
September 12, 2013 at 9:44 am
Nope, because the wrapper is based on Windows Runtime APIs, which are not supported by Portable Class Libraries.
Reply
13.
1.
qmatteoq says:
September 14, 2013 at 3:18 pm
Hi, theres no solution, since sqlite-net (as every other native library) cant be reference in a PCL. What you can do is to write a add a shared interface in the PCL that describes the methods needed to access to the data: then, the specific project implements it using sqlite-net.
Reply
Leave a Reply
Your email address will not be published. Required fields are marked * Name * Email * Website
wp.qmatteoq.com/a-new-sqlite-wrapper-for-windows-phone-8-and-windows-8-the-basics/
10/11
16/9/2556
A new SQLite wrapper for Windows Phone 8 and Windows 8 The basics| qmatteoq.com
8+8=?(robot check) * Comment
You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Post Comment
qmatteoq.com,Windows Phone, Windows 8 and much more,powered by wordpress.org and MetroWP theme
wp.qmatteoq.com/a-new-sqlite-wrapper-for-windows-phone-8-and-windows-8-the-basics/
11/11