Tool that simplifies management and access to SQLite databases in React Native applications
npm install react-native-sqlite-storage
npm install react-native-sqlite-manager
You just have to import the library like this:
import { DB } from 'react-native-sqlite-manager';
Open the database using
const db = await DB.open("example.db");
Now, whenever you need to make some database call you can use db variable to execute the database query.
const { rows } = await db.executeSql(`
SELECT id, name, color FROM tb_animals
`)
Get row values
for (const row of rows) {
const id = row["id"]
const name = row["name"]
const color = row["color"]
}
Initialize the database in your React Native application as follows:
function App(): JSX.Element {
const [loading, setLoading] = useState(true);
useEffect(() => {
setLoading(true)
// We get a database instance by name, and Initialize the database schema.
const db = DB.get(/*database name*/"example.db")
db.migrate(new Migration(), /*database version*/ 1).then(() => {
setLoading(false)
})
}, []);
if (loading) {
return (
<ActivityIndicator animating={true} size='large' style={{flex: 1}} />
)
}
return (
<PaperProvider>
<AppNavigator/>
</PaperProvider>
);
}
Define your database Schema by creating a class that extends ItMigration:
import { DB, ItMigration, Schema } from 'react-native-sqlite-manager';
export default class Migration extends ItMigration {
/**
* When the database is created
* @param db
*/
async onCreate(db: DB) {
const schema = new Schema(db)
await schema.create("tb_animals", (table) => {
table.increments("id")
table.text("name")
table.text("color")
table.integer("age")
table.integer("timestamp")
});
}
}
// SELECT id, name, color FROM tb_animals
// WHERE age > 8 AND age < 12
// ORDER BY name ASC
// LIMIT 30 OFFSET 60
const rows = await db.table('tb_animals')
.select('id, name, color')
.where("age > ? AND age < ?", [8, 12])
.orderBy('name ASC')
.limit(30)
.page(3)
.get()
// INSERT INTO tb_animals(name, color, age, timestamp)
// VALUES("Bob", "Brown", 2, 1699018870505)
const insertId = await db.table('tb_animals')
.insert({
name: 'Bob',
color: 'Brown',
age: 2,
timestamp: Date.now(),
})
// UPDATE tb_animals SET name = "Bob" WHERE id = 7
const rowsAffected = await db.table('tb_animals')
.where("id = ?", [7])
.update({
name: 'Bob',
})
// DELETE FROM tb_animals WHERE id = 8
const rowsAffected = await db.table('tb_animals')
.where("id = ?", [7])
.delete()
Create a model for your database table by extending the Model class:
import { Model } from 'react-native-sqlite-manager';
export default class Animal extends Model {
public id: number;
public name: string;
public color: string;
public age: number;
public timestamp: number;
constructor(props: any = {}) {
super(props)
}
static get databasaName(): string {
return 'example.db'
}
static get tableName(): string {
return 'tb_animals'
}
}
// SELECT * FROM tb_animals
const animals = await Animal.all()
// SELECT * FROM tb_animals WHERE id = 1
const animalById = await Animal.find(1)
// SELECT * FROM tb_animals WHERE age > 10
const animalByAge = await Animal.findBy("age", ">", 10)
// SELECT * FROM tb_animals ORDER BY ROWID ASC LIMIT 1
const firtsAnimal = await Animal.first()
// SELECT id, name, color FROM tb_animals
// WHERE age > 8 AND age < 12
// ORDER BY name ASC
// LIMIT 30 OFFSET 60
const animalsByQuery = await Animal.query({
columns: 'id, name, color',
where: {
clause: 'age > ? AND age < ?',
args: [ 8, 12 ],
},
page: 3,
limit: 30,
order: 'name ASC'
})
// INSERT INTO tb_animals(name, color, age, timestamp)
// VALUES("Bob", "Brown", 2, 1699018870505)
const createdAnimal = await Animal.create({
name: 'Bob',
color: 'Brown',
age: 2,
timestamp: Date.now(),
})
// UPDATE tb_animals SET name = "Bob" WHERE id = 7
const updatedAnimal = await Animal.update({
id: 7,
name: 'Bob',
})
// DELETE FROM tb_animals WHERE id = 8
await Animal.destroy(8)
const animalById = await Animal.find(1)
animalById.age = 12
await animalById.save()
export default class Animal extends Model {
...
static async getAnimals(): Promise<any[]> {
const { rows } = await Animal.executeSql(`
SELECT * FROM tb_animals WHERE age > ? AND age < ?
`, [
8, 12
])
return rows
}
}
const { rows } = await db.executeSql(`
SELECT id, name, color FROM tb_animals
WHERE age > ? AND age < ?
ORDER BY name ASC
LIMIT 30 OFFSET 60
`, [
8, 12
])
const { insertId } = await db.executeSql(`
INSERT INTO tb_animals(name, color, age, timestamp)
VALUES("Bob", "Brown", 2, 1699018870505)
`)
const { rowsAffected } = await db.executeSql(`
UPDATE tb_animals SET name = "Bob" WHERE id = 7
`)
const { rowsAffected } = await db.executeSql(`
DELETE FROM tb_animals WHERE id = 8
`)
const db = DB.get(/*name*/ "myApp.db")
db.migrate(new Migration(), /*version*/ 2).then(() => {
setLoading(false)
})
In the code above, we use DB.get("myApp.db")
to access the database instance, new Migration()
to create an updated database schema, and 2 to set the new database version.
In the updated Migration class, you can define changes to the database structure for the new version. For example, you can add new columns to existing tables. Here's an example of an updated schema class:
import { DB, ItMigration, Schema } from 'react-native-sqlite-manager';
export default class Migration extends ItMigration {
/**
* When the database is created
* @param db
*/
async onCreate(db: DB) {
const schema = new Schema(db)
await schema.create("tb_animals", (table) => {
table.increments("id")
table.text("name")
table.text("color")
table.integer("age")
table.integer("timestamp")
table.text("description").defaultVal("") // db version 2
});
}
/**
* When the database version is updated
* @param {DB} db
* @param {number} oldVersion
* @param {number} newVersion
*/
async onUpdate(db: DB, oldVersion: number, newVersion: number) {
if (oldVersion != newVersion) {
// update version db
const schema = new Schema(db)
await schema.alter("tb_animals", (table) => {
table.text("description").defaultVal("") // db version 2
});
}
}
}
In the Migration
class, you can add new database structure changes as needed for the updated version, such as adding new
-
Initializes the
DB
instance.Parameters:
-
name
(string): Name of the database.
-
-
Obtains an instance of the database.
Parameters:
-
name
(string): Name of the database.
Returns:
-
DB
: Instance of the database.
-
-
Opens the database asynchronously and returns a promise resolving to the
SQLiteDatabase
instance.Returns:
-
Promise<SQLiteDatabase>
: Promise resolving to theSQLiteDatabase
instance.
-
- Closes the database connection.
-
Executes an SQL statement and returns a promise resolving to the result.
Parameters:
-
sql
(string): SQL statement. -
params
(any[]): Parameters for the SQL statement. Default is an empty array.
Returns:
-
Promise<ResultSet>
: Promise resolving to the result of the query.
-
-
Executes a series of SQL statements in bulk and returns a promise resolving to an array of results.
Parameters:
-
sqls
(string[]): Array of SQL statements. -
params
(any[][]): Array of arrays of parameters for the SQL statements.
Returns:
-
Promise<ResultSet[]>
: Promise resolving to an array of results of the queries.
-
-
Retrieves the database version.
Returns:
-
Promise<number>
: Promise resolving to the current version number of the database.
-
-
Sets the database version.
Parameters:
-
version
(number): New version number for the database.
Returns:
-
Promise<any>
: Promise resolving to information about the operation.
-
-
Initializes the database schema.
Parameters:
-
migration
(ItMigration): Database schema. -
version
(number): New version number for the database.
-
-
Gets a
QueryBuilder
for the specified table.Parameters:
-
tableName
(string): Name of the table.
Returns:
-
QueryBuilder
: Instance ofQueryBuilder
.
-
-
Type:
number | undefined
- Description: The ID of the last inserted row, if applicable.
-
Type:
number
- Description: The number of rows affected by the query.
-
Type:
any[]
- Description: An array containing the result rows of the query.
-
Initializes the
QueryBuilder
instance.Parameters:
-
database
(DB): Instance of the database. -
tableName
(string): Name of the table.
-
-
Specifies the columns to be selected in the query.
Parameters:
-
columns
(string[]): Array of column names. Default is an empty array.
Returns:
-
QueryBuilder
: Instance ofQueryBuilder
with the SELECT clause.
-
-
Specifies the WHERE clause in the query.
Parameters:
-
condition
(string): WHERE clause condition. -
params
(any[]): Parameters for the WHERE condition. Default is an empty array.
Returns:
-
QueryBuilder
: Instance ofQueryBuilder
with the WHERE clause.
-
-
Specifies the ORDER BY clause in the query.
Parameters:
-
column
(string): Column name to sort by. -
order
('ASC' | 'DESC'): Sorting order. Default is 'ASC'.
Returns:
-
QueryBuilder
: Instance ofQueryBuilder
with the ORDER BY clause.
-
-
Specifies the LIMIT clause in the query.
Parameters:
-
limit
(number): Maximum number of rows to return. -
offset
(number): Number of rows to skip. Default is 0.
Returns:
-
QueryBuilder
: Instance ofQueryBuilder
with the LIMIT clause.
-
-
Executes the SELECT query and returns a promise resolving to the result.
Returns:
-
Promise<ResultSet>
: Promise resolving to the result of the query.
-
-
Executes the INSERT query and returns a promise resolving to the result.
Parameters:
-
values
(Record<string, any>): Object containing column-value pairs to insert.
Returns:
-
Promise<ResultSet>
: Promise resolving to the result of the query.
-
-
Executes the UPDATE query and returns a promise resolving to the result.
Parameters:
-
values
(Record<string, any>): Object containing column-value pairs to update.
Returns:
-
Promise<ResultSet>
: Promise resolving to the result of the query.
-
-
Executes the DELETE query and returns a promise resolving to the result.
Returns:
-
Promise<ResultSet>
: Promise resolving to the result of the query.
-
-
Type:
string
- Description: Name of the database. Throws an error if not defined.
-
Type:
string
- Description: Name of the table. Throws an error if not defined.
-
Type:
string
-
Default:
"id"
-
Description: Primary key of the table. Defaults to
"id"
.
-
Initializes a new instance of the model.
Parameters:
-
props
(any): Object containing properties to set on the model instance.
-
-
Gets all properties of the model instance.
Returns:
-
any
: Object containing all properties of the model instance.
-
-
Sets properties on the model instance.
Parameters:
-
props
(any): Object containing properties to set on the model instance.
-
-
Saves the model instance to the database. Creates a new record if the primary key is not set; otherwise, updates the existing record.
Returns:
-
Promise<any | undefined>
: Promise resolving to the saved or updated record.
-
-
Deletes the model instance from the database.
Returns:
-
Promise<number>
: Promise resolving to the number of affected rows.
-
-
Executes a raw SQL query on the database.
Parameters:
-
sql
(string): SQL query. -
params
(any[]): Parameters for the SQL query. Default is an empty array.
Returns:
-
Promise<ResultSet>
: Promise resolving to the result of the query.
-
-
Retrieves all records from the table.
Returns:
-
Promise<any[]>
: Promise resolving to an array of records.
-
-
Finds a record by a specified column and value.
Parameters:
-
column
(string): Name of the column to search. -
op
(string): Comparison operator (e.g., "=", "<>", "LIKE"). -
value
(string): Value to search for.
Returns:
-
Promise<any | undefined>
: Promise resolving to the found record.
-
-
Finds a record by its primary key.
Parameters:
-
id
(any): Value of the primary key.
Returns:
-
Promise<any | undefined>
: Promise resolving to the found record.
-
-
Retrieves the first record from the table.
Returns:
-
Promise<any | null>
: Promise resolving to the first record.
-
-
Retrieves the last record from the table.
Returns:
-
Promise<any | null>
: Promise resolving to the last record.
-
-
Counts the number of records in the table.
Returns:
-
Promise<number>
: Promise resolving to the count of records.
-
-
Executes a query with specified options.
Parameters:
-
options
(QueryOptions): Options for the query.
Returns:
-
Promise<any[]>
: Promise resolving to an array of records.
-
-
Creates a new record in the table.
Parameters:
-
obj
(any): Object containing column-value pairs for the new record.
Returns:
-
Promise<any | undefined>
: Promise resolving to the created record.
-
-
Updates a record in the table.
Parameters:
-
obj
(any): Object containing column-value pairs for the update.
Returns:
-
Promise<any | undefined>
: Promise resolving to the updated record.
-
-
Deletes a record from the table by its primary key.
Parameters:
-
id
(any): Value of the primary key.
Returns:
-
Promise<number>
:
-
See the contributing guide to learn how to contribute to the repository and the development workflow.
MIT
Made with create-react-native-library