ค้นหาเว็บไซต์

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

ฉันได้พบวิธีแก้ปัญหานี้โดยทำตามขั้นตอน

  1. ปรับเอนทิตีของตารางเป็น

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

  2. นำฐานข้อมูลที่มีอยู่ไปไว้ในไดเรกทอรี

    android/app/src/main/assets or android/app/src/main/assets/www
  3. ประกาศ 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");
  }
);
  1. ถอนการติดตั้งแอปหากคุณได้ติดตั้งแล้วในอุปกรณ์จริงของคุณ (เพราะแอปจะไม่อัปเดตไฟล์ฐานข้อมูล) แล้วจึงรันการสร้างใหม่อีกครั้ง

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