Re: [SailfishDevel] QSqlTableModel and running several remorses
François K. kirjoitti ma tammikuuta 18 12:35:14 2016 GMT+0200: > > PS: I haven't investigated the proxy approach yet. I'll probably give it a > try in the next few days. > You can see my proxy list implementation from https://github.com/jollailija/nettiradio (fav manager + fav dialog). It's a bit messy, since I ran out of time and had to finish it quickly. For example the entry multiplies at proxy level after saving edited station. It's easy to fix, I just don't have the time. Cheers, jollailija -- Lähetetty Jollastani ___ SailfishOS.org Devel mailing list To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org
Re: [SailfishDevel] QSqlTableModel and running several remorses
Hi, Allright, I've done some further testing and I also read some parts of the QSqlTableModel source code to understand what's going on. I've finally managed to get something working. For people that might be interested in it, I figured out that : - You have to emit the `beginRemoveRows` and `endRemoveRows` signals when removing an item from the model. The provided implementation of `removeRows` doesn't do it for you (that was my main issue) ; - You have to use `OnManualSubmit` strategy. Using `OnFieldChange` strategy has some side-effects that will cause either a segfault or wrong data being manipulated (when several remorses are running at the same time) ; - Since you have to use `OnManualSubmit`, you also have to call `submitAll` at some point to "commit" the changes made on the model. If you don't call it or if your app crashes before, all the changes will be lost (which, IMHO, is a major drawback). If someone knows an app that uses a QSqlTableModel, I'd be interested in reading the source code to see if there is another solution. Feel free to add whatever you want that could help me :) PS: I haven't investigated the proxy approach yet. I'll probably give it a try in the next few days. Cheers, -- François - Mail original - > Hi, > > I've stumbled upon something very annoying : > > I have a model that inherits from QSqlTableModel. A SilicaListView > shows the data. This is very easy to do, thanks to Qt/QML :) > > Each list item has a ContextMenu with a "Delete" entry that allows > the user to delete the item. It runs a remorse, and, at the end of > the remorse, the item is deleted from the model (and the database). > Again, this works quite well... until you try to delete several items > at the same time > > A QSqlTableModel can have 3 different edit strategies : > OnManualSubmit, OnRowChange or OnFieldChange. > > If I set it to "OnManualSubmit", the item is deleted from the model, > but it remains in the view and in the database until I call > QSqlTableModel::submitAll(). This method actually commits the > changes to the database, and resets the model by calling > QSqlTableModel::select(). Since the model is resetted, it loses all > other running remorses and causes a segfault. > > If I set it to "OnFieldChanged", the item is deleted from the model > and from the database, but it will still remain visible in the view. > According to the Qt doc, I should call select() to update the view. > But, as we've seen before, this destroys the other running remorses > and also causes a segfault. > > > I've made a very small app to demonstrate the problem, you can get it > here and try it in your emulator : git clone > https://github.com/Frzk/dummy.git > You can use the PullDownMenu to switch between OnManualSubmit and > OnFieldChanged strategies. > > > > How should I deal with this ? This is a very simple case, yet I can't > seem to find a solution :( > > > > All the best, > > -- > François > ___ SailfishOS.org Devel mailing list To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org
Re: [SailfishDevel] QSqlTableModel and running several remorses
Hi Francoise, Yeah, sorry about that. I'm not used to working in team and I also avoid variable names that can look like keywords (i.e. "list"). I also always use "r" for the variable that is returned. I see. I use Longer Names to avoid the keywords stuff, like remorseList. IDE will always offer you the long names so it is not an issue for me. Thanks that you added some more comments. Hmm, However I would not say that this is neccessary for team effort. It is a Maintenance thing. Even you will forget what you have done today. Maybe you remeber it in the next 3 years, but in 10 years you will not know what you had in mind. I think it is best to routinly think of speakable names. I never use one digit Variables. So in you own interest I would recommend to think in longer terms in general - I mean we live in a time where everything last shorter and shorter. I think this is not something we should aim at in general. Well it's seems pretty obvious : I want to remove several items from the list, one after the other. When you do this quickly, several remorses can run at the same time. I would use slot&signals and actions to use with the QML. And what I would do I would first let the user collect what he want to delete and then have a a menue or gesture to execute. I personly very much like the youtube tutorials from voidrealms. Even they are for Desktop Programming he shows all the tools that you need to know for gui Programming with QT. They should be the same base then for Silica.;) Check these out: Signal & slots -> https://youtu.be/JtyCM4BTbYo?list=PL2D1942A4688E9D63 Actions -> https://youtu.be/uLF9KWUR9ro?list=PL2D1942A4688E9D63 threads create -> https://youtu.be/JaGqGhRW5Ks?list=PL2D1942A4688E9D63 threads priority -> https://youtu.be/JaGqGhRW5Ks?list=PL2D1942A4688E9D63 threads deadlock -> https://youtu.be/5WEiQ3VJfxc?list=PL2D1942A4688E9D63 threads gui -> https://youtu.be/PR6wVy7Et1A?list=PL2D1942A4688E9D63 Sorry, I am working (currently) as software architect, and this is just to much my job ... :P Have fun! Peter ___ SailfishOS.org Devel mailing list To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org
Re: [SailfishDevel] QSqlTableModel and running several remorses
François K. kirjoitti ke joulukuuta 30 00:07:29 2015 GMT+0200: > How would you make such a thing ? Use the destructor of the proxy to update > the database ? The remorse would just delete the item from the QML list model, and then you could have a update timer (to prevent updating the whole list at db every time the user changes the proxy list) that starts running when the list's count has changed (for example. Doesn't work when you do something else than add/remove). The timer would then execute a loop like this: function saveListToDB() { dbOpenConnection() dbDropTable() // the risky part var i = 0 for (i I have to admit that I don't really like this approach, it sounds kinda risky > to me. The second one is pretty safe :) > And it also means that I have to add extra loops for something that shouldn't > require it. Efficiency-wice it doesn't really matter, after all your QSQLModel must read the database as well. I am also working on something that has a modifiable list stored with SQL. I'll link you the code after I'm done with it. > Thanks again :) No problem, I might accidentally learn something while doing this. Cheers, jollailija -- Lähetetty Jollastani ___ SailfishOS.org Devel mailing list To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org
Re: [SailfishDevel] QSqlTableModel and running several remorses
Hi, Thanks for your input :) > Hi, I am a SQL noob, but here's my piece of advice: > Use a QML list model as a "proxy" and then replace the database with > the QML list model's data at some point, like after the user exits > some sort of list edit mode. It might not be the most efficient way > but it works and is really easy, you just need a loop that throws > all the things from the QML list model into the SQL database and > another one to do this the other way around. How would you make such a thing ? Use the destructor of the proxy to update the database ? I have to admit that I don't really like this approach, it sounds kinda risky to me. And it also means that I have to add extra loops for something that shouldn't require it. But I'll probably give it a try if I don't get any other lead :) Thanks again :) -- François ___ SailfishOS.org Devel mailing list To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org
Re: [SailfishDevel] QSqlTableModel and running several remorses
Hi Peter, hi guys, First, thanks for your answer and ideas :) > I find your code a bit hard to read. It would be nice if you use full > names like list instead of l. I know it is annoying, but makes live > easier in the long run. Yeah, sorry about that. I'm not used to working in team and I also avoid variable names that can look like keywords (i.e. "list"). I also always use "r" for the variable that is returned. I have uploaded a new version of the code with "l" replaced with "list" and some more comments. If you have other remarks, please tell me, I'll try to improve that :) > Why do you have more then one Remorse? This is not clear to me. Maybe > you can explain? Well it's seems pretty obvious : I want to remove several items from the list, one after the other. When you do this quickly, several remorses can run at the same time. > Where do you close your db connection? - May I have overlooked this > :( You didn't overlooked it. I don't close it in the small example I wrote. In my real app, I have a "Storage" class that opens the database when the app starts and closes it when the object is destroyed. > Could not find the method Match in the documentation or in the code > :(. > > QModelIndexList l = this -> match ( this -> index ( 0 , 0 ), > MModel::IdRole, itemId, 1 , > Qt::MatchExactly); > > I check against http://doc.qt.io/qt-5/qsqltablemodel.html What is > your reference? It's inherited from QAbstractItemModel : http://doc.qt.io/qt-5/qabstractitemmodel.html#match > SQLLite may only support multiple readers or one writer. Maybe this > is your Problem? I don't think so, I'm writing (deleting) one item after another. > I would honestly have One Data Object that knows how to read from the > DB and open and closes the Connection for each operation with the DB > seperatly. > Not sure if this solves you Problem but it makes it easier to debug > and Maintain. (Maybe Code is slower... But I rather have a rugged > Code then a fast one.) > > I would think in Layers: > USER > VIEW > APPDATAMODEL > DATABASE CONNECTOR > DATABSE I'm not sure that would make a difference here but I will definitely consider this, thanks :) > Hope this helps you a bit. Of course it does :) Thanks a lot, Cheers, -- François ___ SailfishOS.org Devel mailing list To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org
Re: [SailfishDevel] QSqlTableModel and running several remorses
Hello Francoise, I find your code a bit hard to read. It would be nice if you use full names like list instead of l. I know it is annoying, but makes live easier in the long run. Why do you have more then one Remorse? This is not clear to me. Maybe you can explain? Where do you close your db connection? - May I have overlooked this :( Could not find the method Match in the documentation or in the code :(. QModelIndexList l = this->match( this->index(0, 0), MModel::IdRole, itemId, 1, Qt::MatchExactly); I check against http://doc.qt.io/qt-5/qsqltablemodel.html What is your reference? SQLLite may only support multiple readers or one writer. Maybe this is your Problem? I would honestly have One Data Object that knows how to read from the DB and open and closes the Connection for each operation with the DB seperatly. Not sure if this solves you Problem but it makes it easier to debug and Maintain. (Maybe Code is slower... But I rather have a rugged Code then a fast one.) I would think in Layers: USER VIEW APPDATAMODEL DATABASE CONNECTOR DATABSE Hope this helps you a bit. All the best Peter On 28.12.2015 21:59, François K. wrote: Hello, I sent the following email a few weeks ago but got no answer. The github statistics also show that only one person downloaded the "dummy" project I wrote to demonstrate my issue... :( With the recent announcements and the Jolla boat sailing on, I'd like to get this solved. I'm even willing to pay if necessary. Thanks a lot, All the best, - Mail original - I have a model that inherits from QSqlTableModel. A SilicaListView shows the data. This is very easy to do, thanks to Qt/QML :) Each list item has a ContextMenu with a "Delete" entry that allows the user to delete the item. It runs a remorse, and, at the end of the remorse, the item is deleted from the model (and the database). Again, this works quite well... until you try to delete several items at the same time A QSqlTableModel can have 3 different edit strategies : OnManualSubmit, OnRowChange or OnFieldChange. If I set it to "OnManualSubmit", the item is deleted from the model, but it remains in the view and in the database until I call QSqlTableModel::submitAll(). This method actually commits the changes to the database, and resets the model by calling QSqlTableModel::select(). Since the model is resetted, it loses all other running remorses and causes a segfault. If I set it to "OnFieldChanged", the item is deleted from the model and from the database, but it will still remain visible in the view. According to the Qt doc, I should call select() to update the view. But, as we've seen before, this destroys the other running remorses and also causes a segfault. I've made a very small app to demonstrate the problem, you can get it here and try it in your emulator : git clone https://github.com/Frzk/dummy.git You can use the PullDownMenu to switch between OnManualSubmit and OnFieldChanged strategies. How should I deal with this ? This is a very simple case, yet I can't seem to find a solution :( ___ SailfishOS.org Devel mailing list To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org
Re: [SailfishDevel] QSqlTableModel and running several remorses
Hi, I am a SQL noob, but here's my piece of advice: Use a QML list model as a "proxy" and then replace the database with the QML list model's data at some point, like after the user exits some sort of list edit mode. It might not be the most efficient way but it works and is really easy, you just need a loop that throws all the things from the QML list model into the SQL database and another one to do this the other way around. Cheers, jollailija -- Lähetetty Jollastani ___ SailfishOS.org Devel mailing list To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org
Re: [SailfishDevel] QSqlTableModel and running several remorses
Hello, I sent the following email a few weeks ago but got no answer. The github statistics also show that only one person downloaded the "dummy" project I wrote to demonstrate my issue... :( With the recent announcements and the Jolla boat sailing on, I'd like to get this solved. I'm even willing to pay if necessary. Thanks a lot, All the best, - Mail original - > > I have a model that inherits from QSqlTableModel. A SilicaListView > shows the data. This is very easy to do, thanks to Qt/QML :) > > Each list item has a ContextMenu with a "Delete" entry that allows > the user to delete the item. It runs a remorse, and, at the end of > the remorse, the item is deleted from the model (and the database). > Again, this works quite well... until you try to delete several items > at the same time > > A QSqlTableModel can have 3 different edit strategies : > OnManualSubmit, OnRowChange or OnFieldChange. > > If I set it to "OnManualSubmit", the item is deleted from the model, > but it remains in the view and in the database until I call > QSqlTableModel::submitAll(). This method actually commits the > changes to the database, and resets the model by calling > QSqlTableModel::select(). Since the model is resetted, it loses all > other running remorses and causes a segfault. > > If I set it to "OnFieldChanged", the item is deleted from the model > and from the database, but it will still remain visible in the view. > According to the Qt doc, I should call select() to update the view. > But, as we've seen before, this destroys the other running remorses > and also causes a segfault. > > I've made a very small app to demonstrate the problem, you can get it > here and try it in your emulator : git clone > https://github.com/Frzk/dummy.git > You can use the PullDownMenu to switch between OnManualSubmit and > OnFieldChanged strategies. > > How should I deal with this ? This is a very simple case, yet I can't > seem to find a solution :( -- François ___ SailfishOS.org Devel mailing list To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org