Dynamically display data from (design-time unknown) SQLite db to a table view
I'm trying to have a Table View displaying the content of a generic SQLite table. The user selects a SQLite file at runtime (I cannot know its structure at design-time). I am then able to extract a list of all the tables available in the db, along with their structures (the fields and field-types in each table) and data. Now… How do I show them in a Table View?
I really appreciate Core Data, so I'm trying to use this framework. I can import all the SQLite db in a "static" general purpose Core Data model. It has three entities: Table, Field and Value.
Each table object has a to-many relationship with its fields. Each field has a to-many relationship with the values it has for each row in the table.
I know this looks weird (and I gladly accept radically alternative suggestions), but it works: I can import all the SQLite db data in a Core Data model, no matter how the db is structured.
In ord开发者_高级运维er to present the data from a table to the user, however, I should "recompact" all data from fields and values related to the table in a single table view, where a column is required for each field (let alone formatting now, but if this works I should be able to pass all formatting issues to NSFormatter). How can I achieve this? In other words: how do I programmatically create columns in a table view and bind them to a dynamically created array controller?
It doesn't look like CoreData is particularly useful here for you. It's interesting that you have a general CD model representing an arbitrary DB, but it doesn't seem like you are using or need the most important features of CoreData, such as persistence, undo management etc. That said, given your current setup, you can drive the tableView off of it pretty easily by implementing the dataSource methods / protocol for tableView, instead of using bindings or an NSArrayController.
It is possible to use bindings for this, but you would have to call the bind: methods on columns that you instantiate yourself dynamically. You would then need to create an object that overrides the valueForKey: method and finds the required field value dynamically.
I've done this a lot in my current project. I actually build a model/object that will hold my SQLite data. Then I extract the data by running a query, in a loop I instantiate my model object and extract the different column into their correct variables.
Then I add each object created to an NSMutableArray. I work in the NSTableView with this Mutable array. It is pretty simple and super fast. I even done an auto completion system with this method.
I can share code if you need/want.
If you want to know a list of all the tables in a SQLite database, you can execute:
select tbl_name from sqlite_master where type='table';
And if you know the name of a table, you can get information about its schema by doing:
pragma table_info(theTableName);
As always, I suggest using the Flying Meat Database wrapper to interact with the SQLite database. It is a wonderfully simple and easy-to-use way to manipulate information from a SQLite file.
As for displaying the info in an NSTableView
, it'd be pretty easy to remove all the columns from the tableView and add new columns, one for each field in the current table. I've done this myself, and it's pretty straight-forward.
精彩评论