Skip to content

Commit 6724156

Browse files
committed
Update README.md
1 parent 21473b6 commit 6724156

1 file changed

Lines changed: 90 additions & 60 deletions

File tree

README.md

Lines changed: 90 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -111,86 +111,116 @@ SQLitePCL.pretty has a very simple table mapping ORM, available in the SQLitePCL
111111

112112
```CSharp
113113

114-
public void Example()
114+
// Per thread builder to limit the number of instances.
115+
private static readonly ThreadLocal<TestObject.Builder> testObjectBuilder = new
116+
ThreadLocal<TestObject.Builder>(() => new TestObject.Builder());
117+
118+
public void Example()
119+
{
120+
// You must provide a result selector to convert a result set row into an object.
121+
// By making this an explicit parameter, SQLitePCL.pretty can support immutable object builders.
122+
var resultSelector =
123+
ResultSet.RowToObject(
124+
() => testObjectBuilder.Value,
125+
o => ((TestObject.Builder)o).Build());
126+
127+
using (var db = SQLite3.OpenInMemory())
115128
{
116-
var table = TableMapping.Create<TestObject>(
117-
() => testObjectBuilder.Value,
118-
o => ((TestObject.Builder)o).Build());
129+
// Creates the table and indexes if they do not yet exist.
130+
db.InitTable<TestObject>();
131+
132+
// Insert a new object into the database that has nullable values.
133+
// InsertOrReplace returns the resulting object in the database along with
134+
// its new primary key and any default values assigned by the database.
135+
var inserted =
136+
db.InsertOrReplace(
137+
new TestObject.Builder() { Value = "Hello" }.Build(),
138+
resultSelector);
139+
140+
// Lookup the object in the database.
141+
TestObject found;
142+
if (!db.TryFind(inserted.Id.Value, resultSelector, out found))
143+
{
144+
throw new Exception("item not found");
145+
}
119146

120-
using (var db = SQLite3.OpenInMemory())
147+
// We can use linq like syntax to write queries against the database.
148+
var query =
149+
SqlQuery.From<TestObject>()
150+
.Select()
151+
// This creates a named bind parameter ":value"
152+
.Where<string>((x, value) => x.Value.Contains(value))
153+
.OrderBy(x => x.Value)
154+
.Take(100)
155+
.Skip(0);
156+
157+
using (var stmt = db.PrepareStatement(query))
121158
{
122-
db.InitTable(table);
123-
124-
var inserted = db.InsertOrReplace(table, new TestObject.Builder() { Value = "Hello" }.Build());
125-
126-
TestObject found;
127-
if (!db.TryFind(table, inserted.Id, out found))
128-
{
129-
throw new Exception("item not found");
130-
}
131-
132-
TestObject deleted;
133-
if (!db.TryDelete(table, inserted.Id, out deleted))
134-
{
135-
throw new Exception("deletion failed");
136-
}
159+
stmt.BindParameters[":value"].Bind("ell");
160+
// This will throw if no results are returned
161+
stmt.Query().First();
162+
}
163+
164+
// Delete the object from the database.
165+
TestObject deleted;
166+
if (!db.TryDelete(inserted.Id.Value, resultSelector, out deleted))
167+
{
168+
throw new Exception("deletion failed");
137169
}
138170
}
171+
}
139172

140-
// Per thread builder to limit the number of instances.
141-
private static readonly ThreadLocal<TestObject.Builder> testObjectBuilder = new
142-
ThreadLocal<TestObject.Builder>(() => new TestObject.Builder());
143173

144-
public sealed class TestObject : IEquatable<TestObject>
174+
public sealed class TestObject : IEquatable<TestObject>
175+
{
176+
public class Builder
145177
{
146-
public class Builder
147-
{
148-
private long? id;
149-
private string value;
178+
private long? id;
179+
private string value;
150180

151-
public long? Id { get { return id; } set { this.id = value; } }
152-
public string Value { get { return value; } set { this.value = value; } }
181+
public long? Id { get { return id; } set { this.id = value; } }
182+
public string Value { get { return value; } set { this.value = value; } }
153183

154-
public TestObject Build()
155-
{
156-
return new TestObject(id, value);
157-
}
184+
public TestObject Build()
185+
{
186+
return new TestObject(id, value);
158187
}
188+
}
159189

160-
private long? id;
161-
private string value;
190+
private long? id;
191+
private string value;
162192

163-
private TestObject(long? id, string value)
164-
{
165-
this.id = id;
166-
this.value = value;
167-
}
193+
private TestObject(long? id, string value)
194+
{
195+
this.id = id;
196+
this.value = value;
197+
}
168198

169-
[PrimaryKey]
170-
public long? Id { get { return id; } }
199+
[PrimaryKey]
200+
public long? Id { get { return id; } }
171201

172-
public string Value { get { return value; } }
202+
public string Value { get { return value; } }
173203

174-
public bool Equals(TestObject other)
175-
{
176-
return this.Id == other.Id &&
177-
this.Value == other.Value;
178-
}
204+
public bool Equals(TestObject other)
205+
{
206+
return this.Id == other.Id &&
207+
this.Value == other.Value;
208+
}
179209

180-
public override bool Equals(object other)
181-
{
182-
return other is TestObject && this.Equals((TestObject)other);
183-
}
210+
public override bool Equals(object other)
211+
{
212+
return other is TestObject && this.Equals((TestObject)other);
213+
}
184214

185-
public override int GetHashCode()
186-
{
187-
int hash = 17;
188-
hash = hash * 31 + this.Id.GetHashCode();
189-
hash = hash * 31 + this.Value.GetHashCode();
215+
public override int GetHashCode()
216+
{
217+
int hash = 17;
218+
hash = hash * 31 + this.Id.GetHashCode();
219+
hash = hash * 31 + this.Value.GetHashCode();
190220

191-
return hash;
192-
}
221+
return hash;
193222
}
223+
}
194224
```
195225

196226
# How does this compare to...

0 commit comments

Comments
 (0)