Template version: v0.2.2
react-native-sqlite-storage
[!TIP] Github address
Find the matching version information in the release address of a third-party library: @react-native-oh-tpl/react-native-sqlite-storage Releases.For older versions that are not published to npm, please refer to the installation guide to install the tgz package.
Go to the project directory and execute the following instruction:
npm install @react-native-oh-tpl/react-native-sqlite-storage
yarn add @react-native-oh-tpl/react-native-sqlite-storage
The following code shows the basic use scenario of the repository:
[!WARNING] The name of the imported repository remains unchanged.
/**
* @format
*/
import React, {Component} from 'react';
import { StyleSheet, Text, View, FlatList} from 'react-native';
import SQLite from 'react-native-sqlite-storage';
SQLite.DEBUG(true);
SQLite.enablePromise(false);
const database_name = 'Test.db';
const database_version = '1.0';
const database_displayname = 'SQLite Test Database';
const database_size = 200000;
let db: any;
const Item = (props: any) => {
const { title } = props;
return(
<View>
<Text>{title}</Text>
</View>
)
};
interface SQLiteDemo {
progress: string[]
}
interface State {
progress: string[]
}
interface rowsType {
item: any,
length: number
}
interface ResultType {
rows: rowsType
}
class SQLiteDemo extends Component<{}, State> {
constructor(props: any) {
super(props);
this.progress = [];
this.state = {
progress: [],
};
}
updateProgress = (text: string, resetState?: boolean) => {
let progress: string[] = [];
if (!resetState) {
progress = [...this.progress];
}
progress.push(text);
this.progress = progress;
this.setState({
progress,
});
};
componentWillUnmount = () => {
this.closeDatabase();
};
errorCB = (err: any) => {
console.log('error: ', err);
this.updateProgress('Error: ' + (err.message || err));
return false;
};
successCB = () => {
console.log('SQL executed ...');
};
openCB = () => {
this.updateProgress('Database OPEN');
};
closeCB = () => {
this.updateProgress('Database CLOSED');
};
deleteCB = () => {
console.log('Database DELETED');
this.updateProgress('Database DELETED');
};
// eslint-disable-next-line no-shadow
populateDatabase = (db: any) => {
this.updateProgress('Database integrity check');
db.executeSql(
'SELECT 1 FROM Version LIMIT 1',
[],
() => {
this.updateProgress('Database is ready ... executing query ...');
db.transaction(this.queryEmployees, this.errorCB, () => {
this.updateProgress('Processing completed');
});
},
(error: any) => {
console.log('received version error:', error);
this.updateProgress('Database not yet ready ... populating data');
db.transaction(this.populateDB, this.errorCB, () => {
this.updateProgress('Database populated ... executing query ...');
db.transaction(this.queryEmployees, this.errorCB, () => {
console.log('Transaction is now finished');
this.updateProgress('Processing completed');
// this.closeDatabase();
});
});
},
);
};
populateDB = (tx: any) => {
this.updateProgress('Executing DROP stmts');
tx.executeSql('DROP TABLE IF EXISTS Employees;');
tx.executeSql('DROP TABLE IF EXISTS Offices;');
tx.executeSql('DROP TABLE IF EXISTS Departments;');
this.updateProgress('Executing CREATE stmts');
tx.executeSql(
'CREATE TABLE IF NOT EXISTS Version( ' +
'version_id INTEGER PRIMARY KEY NOT NULL); ',
[],
this.successCB,
this.errorCB,
);
tx.executeSql(
'CREATE TABLE IF NOT EXISTS Departments( ' +
'department_id INTEGER PRIMARY KEY NOT NULL, ' +
'name VARCHAR(30) ); ',
[],
this.successCB,
this.errorCB,
);
tx.executeSql(
'CREATE TABLE IF NOT EXISTS Offices( ' +
'office_id INTEGER PRIMARY KEY NOT NULL, ' +
'name VARCHAR(20), ' +
'longtitude FLOAT, ' +
'latitude FLOAT ) ; ',
[],
this.successCB,
this.errorCB,
);
tx.executeSql(
'CREATE TABLE IF NOT EXISTS Employees( ' +
'employe_id INTEGER PRIMARY KEY NOT NULL, ' +
'name VARCHAR(55), ' +
'office INTEGER, ' +
'department INTEGER, ' +
'custom_info TEXT DEFAULT "",' +
'FOREIGN KEY ( office ) REFERENCES Offices ( office_id ) ' +
'FOREIGN KEY ( department ) REFERENCES Departments ( department_id ));',
[],
);
this.updateProgress('Executing INSERT stmts');
tx.executeSql(
'INSERT INTO Departments (name) VALUES ("Client Services");',
[],
);
tx.executeSql(
'INSERT INTO Departments (name) VALUES ("Investor Services");',
[],
);
tx.executeSql('INSERT INTO Departments (name) VALUES ("Shipping");', []);
tx.executeSql(
'INSERT INTO Departments (name) VALUES ("Direct Sales");',
[],
);
tx.executeSql(
'INSERT INTO Offices (name, longtitude, latitude) VALUES ("Denver", 59.8, 34.);',
[],
);
tx.executeSql(
'INSERT INTO Offices (name, longtitude, latitude) VALUES ("Warsaw", 15.7, 54.);',
[],
);
tx.executeSql(
'INSERT INTO Offices (name, longtitude, latitude) VALUES ("Berlin", 35.3, 12.);',
[],
);
tx.executeSql(
'INSERT INTO Offices (name, longtitude, latitude) VALUES ("Paris", 10.7, 14.);',
[],
);
tx.executeSql(
'INSERT INTO Employees (name, office, department, custom_info) VALUES ("Sylvester Stallone", 2, 4, \'{"known": true}\')',
[],
);
tx.executeSql(
'INSERT INTO Employees (name, office, department, custom_info) VALUES ("Elvis Presley", 2, 4, \'{"known": true}\')',
[],
);
tx.executeSql(
'INSERT INTO Employees (name, office, department, custom_info) VALUES ("Leslie Nelson", 3, 4, \'{"known": true}\')',
[],
);
tx.executeSql(
'INSERT INTO Employees (name, office, department, custom_info) VALUES ("Fidel Castro", 3, 3, \'{"known": true}\')',
[],
);
tx.executeSql(
'INSERT INTO Employees (name, office, department, custom_info) VALUES ("Bill Clinton", 1, 3, \'{"known": false}\')',
[],
);
tx.executeSql(
'INSERT INTO Employees (name, office, department, custom_info) VALUES ("Margaret Thatcher", 1, 3, \'{"known": true}\')',
[],
);
tx.executeSql(
'INSERT INTO Employees (name, office, department, custom_info) VALUES ("Donald Trump", 2, 4, \'{"known": true, "impeached": true}\')',
[],
);
tx.executeSql(
'INSERT INTO Employees (name, office, department, custom_info) VALUES ("Dr DRE", 2, 2, \'{"known": true}\')',
[],
);
tx.executeSql(
'INSERT INTO Employees (name, office, department, custom_info) VALUES ("Samantha Fox", 2, 1, \'{"known": true}\')',
[],
);
console.log('all config SQL done');
};
queryEmployees = async (tx: any) => {
console.log('Executing JSON1 queries...');
// 1. JSON_OBJECT
await tx.executeSql(
"SELECT JSON_OBJECT('name', e.name, 'office_id', e.office, 'department_id', e.department) AS data FROM Employees e",
[],
this.querySuccess,
this.errorCB,
);
// 2. JSON_ARRAY
// Expected: [1,2,"3",4]
await tx.executeSql(
"SELECT JSON_ARRAY(1, 2, '3', 4) AS data ",
[],
this.querySuccess,
this.errorCB,
);
// 3. JSON_ARRAY_LENGTH
// Expected: 4
await tx.executeSql(
"SELECT JSON_ARRAY_LENGTH('[1, 2, 3, 4]') AS data",
[],
this.querySuccess,
this.errorCB,
);
// 4. JSON_EXTRACT
await tx.executeSql(
"SELECT JSON_EXTRACT(e.custom_info, '$.known') AS data FROM Employees e",
[],
this.querySuccess,
this.errorCB,
);
// 5. JSON_INSERT
// Expected: {"a":1,"b":2,"c":3}
await tx.executeSql(
'SELECT JSON_INSERT(\'{"a": 1, "b": 2}\', \'$.c\', 3) AS data',
[],
this.querySuccess,
this.errorCB,
);
// 6. JSON_REPLACE
// Expected: {"a":1,"b":3}
await tx.executeSql(
'SELECT JSON_REPLACE(\'{"a": 1, "b": 2}\', \'$.b\', 3) AS data',
[],
this.querySuccess,
this.errorCB,
);
// 7. JSON_SET
// Expected: {"a":1,"b":123}
await tx.executeSql(
'SELECT JSON_SET(\'{"a": 1, "b": 2}\', \'$.b\', 123) AS data',
[],
this.querySuccess,
this.errorCB,
);
// 8. JSON_REMOVE
// Expected: {"a":1"}
await tx.executeSql(
'SELECT JSON_REMOVE(\'{"a": 1, "b": 2}\', \'$.b\') AS data',
[],
this.querySuccess,
this.errorCB,
);
// 9. JSON_TYPE
// Expected: integer
await tx.executeSql(
'SELECT JSON_TYPE(\'{"a": 1, "b": 2}\', \'$.a\') AS data',
[],
this.querySuccess,
this.errorCB,
);
// 10. JSON_VALID
// Expected: 0
await tx.executeSql(
'SELECT JSON_VALID(\'{"a": 1, "b": 2\') AS data',
[],
this.querySuccess,
this.errorCB,
);
// 11. JSON_QUOTE
// Expected: "value"
await tx.executeSql(
"SELECT JSON_QUOTE('value') AS data",
[],
this.querySuccess,
this.errorCB,
);
};
querySuccess = (tx: any, results: ResultType) => {
this.updateProgress('Query completed');
var len = results.rows.length;
for (let i = 0; i < len; i++) {
let row = results.rows.item(i);
this.updateProgress(`${row.data}`);
}
};
loadAndQueryDB = () => {
this.updateProgress('Opening database ...', true);
this.updateProgress('Database OPEN');
db = SQLite.openDatabase(
database_name,
database_version,
database_displayname,
database_size,
this.openCB,
this.errorCB,
);
this.populateDatabase(db);
};
deleteDatabase = () => {
this.updateProgress('Deleting database');
SQLite.deleteDatabase(database_name, this.deleteCB, this.errorCB);
};
closeDatabase = () => {
if (db) {
console.log('Closing database ...');
this.updateProgress('Closing database');
db.close(this.closeCB, this.errorCB);
} else {
this.updateProgress('Database CLOSE callback function error');
// this.updateProgress('Database was not OPENED');
}
};
runDemo = () => {
this.updateProgress('Starting SQLite Callback Demo', true);
this.loadAndQueryDB();
};
attachDatabase = () =>{
if (db!=null) {
this.updateProgress('Attach database ...');
let dbMaster = SQLite.openDatabase('test2.db',database_version,database_displayname,database_size,
() => {
dbMaster.attach( database_name, database_displayname, () => console.log("Database attached successfully"), () => console.log("ERROR"))
this.updateProgress('Attach database successfully');
},
this.errorCB,
);
} else {
this.updateProgress('Database not open');
}
}
render = () => {
return (
<View style={styles.mainContainer}>
<View style={styles.toolbar}>
<Text style={styles.toolbarButton} onPress={this.runDemo}>
Run Demo
</Text>
<Text style={styles.toolbarButton} onPress={this.attachDatabase}>
Attach DB
</Text>
<Text style={styles.toolbarButton} onPress={this.closeDatabase}>
Close DB
</Text>
<Text style={styles.toolbarButton} onPress={this.deleteDatabase}>
Delete DB
</Text>
</View>
<FlatList
data={this.state.progress}
renderItem={({item}) => <Item title={item} />}
keyExtractor={(item: any )=> item.i}
/>
</View>
);
};
}
var listStyles = StyleSheet.create({
li: {
borderBottomColor: '#c8c7cc',
borderBottomWidth: 0.5,
paddingTop: 15,
paddingRight: 15,
paddingBottom: 15,
},
liContainer: {
backgroundColor: '#fff',
flex: 1,
paddingLeft: 15,
},
liIndent: {
flex: 1,
},
liText: {
color: '#333',
fontSize: 17,
fontWeight: '400',
marginBottom: -3.5,
marginTop: -3.5,
},
});
var styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
toolbar: {
backgroundColor: '#51c04d',
paddingTop: 30,
paddingBottom: 10,
flexDirection: 'row',
},
toolbarButton: {
color: 'blue',
textAlign: 'center',
flex: 1,
},
mainContainer: {
flex: 1,
},
});
export default SQLiteDemo;
this repository has been adapted to Codegen
, generate the bridge code of the third-party library by using the Codegen
. For details, see Codegen Usage Guide.
Currently, HarmonyOS does not support AutoLink. Therefore, you need to manually configure the linking.
Open the harmony
directory of the HarmonyOS project in DevEco Studio.
{
...
"overrides": {
"@rnoh/react-native-openharmony" : "./react_native_openharmony"
}
}
Currently, two methods are available:
Method 1 (recommended): Use the HAR file.
[!TIP] The HAR file is stored in the
harmony
directory in the installation path of the third-party library.
Open entry/oh-package.json5
file and add the following dependencies:
"dependencies": {
"@rnoh/react-native-openharmony": "file:../react_native_openharmony",
"@react-native-oh-tpl/react-native-sqlite-storage": "file:../../node_modules/@react-native-oh-tpl/react-native-sqlite-storage/platforms/harmony/sqlite_storage.har"
}
Click the sync
button in the upper right corner.
Alternatively, run the following instruction on the terminal:
cd entry
ohpm install
Method 2: Directly link to the source code.
[!TIP] For details, see Directly Linking Source Code.
Open the entry/src/main/ets/RNPackagesFactory.ts
file and add the following code:
...
+ import {SQLitePluginPackage} from '@react-native-oh-tpl/react-native-sqlite-storage/ts';
export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
return [
new SamplePackage(ctx),
+ new SQLitePluginPackage(ctx)
];
}
Click the sync
button in the upper right corner.
Alternatively, run the following instruction on the terminal:
cd entry
ohpm install
Then build and run the code.
To use this repository, you need to use the correct React-Native and RNOH versions. In addition, you need to use DevEco Studio and the ROM on your phone.
Check the release version information in the release address of the third-party library:@react-native-oh-tpl/react-native-sqlite-storage Releases
[!TIP] If the value of HarmonyOS Support is yes, it means that the HarmonyOS platform supports this property; no means the opposite; partially means some capabilities of this property are supported. The usage method is the same on different platforms and the effect is the same as that of iOS or Android.
Name | Description | Type | Required | Platform | HarmonyOS Support |
---|---|---|---|---|---|
openDatabase | Opens or initializes | void | yes | All | yes |
transaction | SQL transaction distribution | void | yes | All | yes |
close | Closes or releases a previously opened resource | void | yes | All | yes |
deleteDatabase | Deletes a resource | void | yes | All | yes |
attach | Connects or associates with an external resource or database | void | yes | All | yes |
executeSql | Executes a batch of SQL statements in the background without blocking the current thread or process | void | yes | All | yes |
This project is licensed under The MIT License (MIT).
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。