javascript - การสืบค้น TypeORM คืนค่าเป็นอาเรย์ว่าง
ฉันกำลังพยายามดึงข้อมูลจากฐานข้อมูลที่มีอยู่ ฉันเพิ่งเปลี่ยนไปใช้ bare workflow จาก Expo managed พยายามทดสอบ react-native-sqlite-storage กับ TypeORM อย่างไรก็ตาม TypeORM raw query ยังคงส่งกลับอาร์เรย์ว่างและฉันไม่รู้ว่าทำไม
นี่คือโค้ดของฉันและมันอิงตามตัวอย่างนี้ https://dev.to/jgabriel1/expo-sqlite-typeorm-4mn8
DictionaryScreen.js
function DictionaryScreen(props) {
const { ejRepository } = useDatabaseConnection();
const handleinputWord = async () => {
console.log(props.inputWord); //=>this console.logs the text from the input below
try {
const results = await ejRepository.getWordandMean(props.inputWord);
console.log(results); //=> Here I expect an array of the query result but it only returns []
} catch (error) {
console.log(error)
}
}
return(
<View style={styles.searchContainer}>
<MaterialCommunityIcons name="text-search" color="white" size={30}/>
<TextInput
style={styles.input}
onChangeText={props.updateTextInput}
onSubmitEditing={handleinputWord}
value={props.inputWord}
placeholder='Look up the word (Type exactly)'
keyboardType="default"
/>
<StatusBar style='light' />
</View>
)
}
const mapStateToProps = state => {
return {
inputWord: state.inputWord
}
};
const mapDispatchToProps = {updateTextInput};
export default connect(mapStateToProps, mapDispatchToProps) (DictionaryScreen);
repository.ts
export class EJRepository {
private ormRepository: Repository<EJModel>;
constructor(connection: Connection) {
this.ormRepository = connection.getRepository(EJModel);
}
public async getWordandMean(props: any): Promise<EJModel> {
console.log(props); //=> this returns the same text from DictionaryScreen
const results = await this.ormRepository.query(
`SELECT * FROM ejmodel WHERE word LIKE '%${props}%';`, [props]);
return results;
}
}
connection.tsx
interface DatabaseConnectionContextData {
ejRepository: EJRepository;
}
const DatabaseConnectionContext = createContext<DatabaseConnectionContextData>(
{} as DatabaseConnectionContextData,
);
export const DatabaseConnectionProvider: React.FC = ({ children }) => {
const [connection, setConnection] = useState<Connection | null>(null);
const connect = useCallback(async () => {
const createdConnection = await createConnection({
type: 'react-native',
name: "ejdict.v1.0",
database: '***.db',
entities: [EJModel],
location: 'default',
migrations: [ejdict1621603544180],
migrationsRun: true,
synchronize: false,
logging: true,
extra: {createFromLocation: '/Users/***/***/ios/***/www/***.db' }
});
setConnection(createdConnection);
}, []);
useEffect(() => {
if (!connection) {
connect();
}
}, [connect, connection]);
if (!connection) {
return <ActivityIndicator />;
}
return (
<DatabaseConnectionContext.Provider
value={{
ejRepository: new EJRepository(connection),
}}
>
{children}
</DatabaseConnectionContext.Provider>
);
};
export function useDatabaseConnection() {
const context = useContext(DatabaseConnectionContext);
return context;
}
EJModel.ts
import {Entity, PrimaryColumn, Column} from "typeorm";
@Entity({name: "ejmodel"})
export class EJModel {
@PrimaryColumn({type: 'integer'})
item_id: number;
@Column({type: 'text'})
word: string;
@Column({type: 'text'})
mean: string;
@Column({type: 'integer'})
level: number;
}
ป.ล.: เป็นความพยายามที่ไม่ปกติในการโหลดฐานข้อมูลที่มีอยู่ในโปรเจกต์ React Native หรือเปล่า? ตัวอย่างที่ใช้งานได้จริงแทบไม่มีเลย ฉันเคยทำให้มันใช้งานได้บน Expo แต่ฉันรู้ว่าต้องการฟังก์ชันการย้ายข้อมูลและลองทำสิ่งเดียวกันกับ TypeORM เสียเวลาไปเยอะ...
คำตอบ #1
ฉันได้พบวิธีแก้ปัญหานี้โดยทำตามขั้นตอน
ปรับเอนทิตีของตารางเป็น
@Entity({ name: YOUR_TABLE_NAME, synchronize: false, })นำฐานข้อมูลที่มีอยู่ไปไว้ในไดเรกทอรี
android/app/src/main/assets or android/app/src/main/assets/wwwประกาศ Typeorm
export const AppDataSource=new DataSource({ type: "react-native", database:database.db, location: "default", synchronize: true, entities: [YOUR_ENTITY], logging: ["error", "query", "schema"], });
// โปรดทราบว่าสามารถตั้งค่าเป็น false หากคุณต้องการให้ทุกตารางไม่ซิงโครไนส์ หรือสามารถตั้งค่าแยกในแต่ละ Entity เหมือนขั้นตอนที่ 1
4) ในไฟล์ index.android.js หรือ App.js ของคุณ ให้ใช้ openDatabase เพื่อเชื่อมต่อกับฐานข้อมูล
SQLite.openDatabase(
{
name: "database.db",
createFromLocation: "~database23_02_17.db",
location: "default",
},
() => {
console.log("db connection success");
},
() => {
console.log("db connection error");
}
);ถอนการติดตั้งแอปหากคุณได้ติดตั้งแล้วในอุปกรณ์จริงของคุณ (เพราะแอปจะไม่อัปเดตไฟล์ฐานข้อมูล) แล้วจึงรันการสร้างใหม่อีกครั้ง
cd android &&./gradlew clean cd .. && react-native run-android
