J'utilise le module SQLite d'Expo dans mon projet natif réactif. J'ai deux tables, (messages et utilisateurs):L'ID de la table est remplacé par l'ID de la clé étrangère
CREATE TABLE IF NOT EXISTS messages (
id text not null,
sender_id integer,
thread_id integer,
body text,
foreign key (sender_id) references users (id),
foreign key (thread_id) references threads (id)
);
CREATE TABLE IF NOT EXISTS users (
id integer primary key,
first_name text,
last_name text,
email text
);
Et si j'insère des messages:
INSERT INTO messages (id, sender_id, thread_id, body) values ('xeieoef-ee, 3, 1, 'test');
INSERT INTO messages (id, sender_id, thread_id, body) values ('ttrefzr-ry, 3, 1, 'payload');
Je voudrais obtenir en comparant l'identifiant de fil de tous les messages, y compris les données de ses utilisateurs. Voilà comment je suis Interrogation:
select * from messages, users where thread_id = 2 AND messages.sender_id = users.id;
Cependant, il en résulte à la fois l'identifiant du message et l'ID utilisateur d'être le même:
[
{
"body": "test",
"email": "[email protected]",
"first_name": "userThreeF",
"id": 3,
"last_name": "threeUserL",
"sender_id": 3,
"thread_id": 1,
},
{
"body": "payload",
"email": "[email protected]",
"first_name": "userThreeF",
"id": 3,
"last_name": "threeUserL",
"sender_id": 3,
"thread_id": 1,
},
]
au lieu de l'identifiant de message à avoir son propre identifiant, est le message id est l'identifiant de l'expéditeur. Qu'est-ce que je fais mal ici?
Code de mise à jour
J'ai un bouton dans l'application qui onpress
envoie les données à la fonction de la MessageStore
.
sendText =() => {
const {MessageStore, UserStore, SocketStore} = this.props;
const data = {
id: uuid.v4(),
sender_id: UserStore.userInfo.user.id,
thread_id: 1,
body: this.state.text,
}
MessageStore.addMessageToDB(data);
}
Sur le magasin, le message est ajouté à la base de données par le addMessageToDB()
, qui appelle à nouveau la getMessageFromDatabase()
pour obtenir tous les messages.
@action addMessageToDB = (payload) => {
db.transaction(
tx => {
tx.executeSql(
`INSERT INTO messages
(id, sender_id, thread_id, body, status) values (?, ?, ?, ?, ?);`,
[payload.id, payload.sender_id, payload.thread_id, payload.body, "pending"],
(tx, results) => {
console.log('message insertion success')
},
(tx, error) => console.log('message insertion error', error)
);
this.getMessageFromDatabase(payload.thread_id);
}
)
}
@action getMessageFromDatabase = (payload) => {
console.log('>>> getMessageFromDatabase payload', payload);
db.transaction(
tx => {
tx.executeSql(
`select * from messages inner join users on messages.sender_id=users.id where thread_id = ?;`, [payload],
(tx, {rows}) => {
console.log('inner join success', rows._array);
},
(tx, error) => console.log('inner join error', error),
);
}
)
}
Intéressant. J'ai essayé de reproduire le code en collation et j'ai les mêmes résultats. Voici le [lien expo] (https://snack.expo.io/Hy9l69jo-) – Kakar
@Kakar Oui! C'est tout. Aucune idée de ce qui ne va pas ici. –