TypeORM查询返回一个空数组



我正在尝试从现有数据库中检索数据。最近,我从Expo-managed切换到了裸工作流,试图用TypeORM测试react原生sqlite存储。然而,TypeORM原始查询不断返回一个空数组,我不知道为什么。

这是我的代码,它基于这个例子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);

存储库.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;
}
}

连接.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;
}

PS:在React Native项目上加载现有数据库是一种不寻常的尝试吗?工作实例几乎不存在。我曾经在Expo上做过,但我意识到我需要迁移功能,并试图用TypeORM做同样的事情,浪费了很多时间。。。

我通过以下步骤找到了这个问题的解决方案

  1. 将表的实体调整为

    @Entity({ name: YOUR_TABLE_NAME, synchronize: false, })

  2. 将已存在的数据库放入目录

    android/app/src/main/assets or android/app/src/main/assets/www

  3. Typeorm声明

    CCD_ 3,位置:";默认";,synchronize:true,实体:[YOUR_ENTITY],日志记录:["错误"、"查询"、"模式"],})

//注意,如果您希望所有表都不同步,或者可以像步骤1一样在每个实体中单独设置,则可以设置为false
4(在index.android.js或App.js文件中,打开database以连接到数据库。

SQLite.openDatabase(
{
name: "database.db",
createFromLocation: "~database23_02_17.db",
location: "default",
},
() => {
console.log("db connection success");
},
() => {
console.log("db connection error");
}
);

  1. 如果您已经在物理设备中安装了应用程序,请卸载该应用程序(因为该应用程序不会更新数据库文件(,然后再次运行构建

    cd android &&./gradlew clean cd .. && react-native run-android

最新更新