I have sort of figured out that what I have to do is have a separate chapters table as it needs extra information in it for each chapter that I don't want duplicated.
Then I have a separate chapter categories table which I can link to the chapter name in one query.
Haven't figured out how to write it yet but don't need to store level numbers as I chapter name is 1, category is 2 and subcategory is 3.
Code: Select all
;==============================================================================================================================================================================
;
;==============================================================================================================================================================================
UseSQLiteDatabase() ; Tell compiler we are using SQLite support
;==============================================================================================================================================================================
;
;==============================================================================================================================================================================
Global DatabaseHandle.i, DatabaseName.s ;
;==============================================================================================================================================================================
;
;==============================================================================================================================================================================
CurrentDirectory.s = GetCurrentDirectory() ;
DatabaseName.s = CurrentDirectory.s + "Stuffaduckelse.db" ;
;==============================================================================================================================================================================
;
;==============================================================================================================================================================================
Declare OpenMasterRecipebook() ;
Declare.s CountRecords(TableField.s, TableName.s) ;
Declare InsertDummyData() ;
;==============================================================================================================================================================================
; Try to open the system database and create missing tables
;==============================================================================================================================================================================
Procedure OpenMasterRecipebook()
Protected FileHandle.i, DatabaseUpdate.s
FileHandle.i = OpenFile(#PB_Any, DatabaseName.s)
If FileHandle.i
CloseFile(FileHandle.i)
DatabaseHandle.i = OpenDatabase(#PB_Any, DatabaseName.s, "", "", #PB_Database_SQLite)
If DatabaseHandle.i <> 0
; Write out the chapters table
DatabaseUpdate.s = "CREATE TABLE IF NOT EXISTS Chapters("
DatabaseUpdate.s + "Chaptername TEXT, "
DatabaseUpdate.s + "Description TEXT, "
DatabaseUpdate.s + "Createdon INTEGER, "
DatabaseUpdate.s + "Recordid INTEGER PRIMARY KEY AUTOINCREMENT, "
DatabaseUpdate.s + "UNIQUE (Chaptername))"
If Not DatabaseUpdate(DatabaseHandle.i, DatabaseUpdate.s)
Debug DatabaseError()
EndIf
; Write the linked categories/subcategories table out. Each chapter can have the same categories and subcategories
DatabaseUpdate.s = "CREATE TABLE IF NOT EXISTS ChapterCategories("
DatabaseUpdate.s + "Categoryid INTEGER PRIMARY KEY AUTOINCREMENT, " ; This entry's own id
DatabaseUpdate.s + "Category TEXT, "
DatabaseUpdate.s + "Subcategory TEXT, "
DatabaseUpdate.s + "Recordid INTEGER, "
DatabaseUpdate.s + "FOREIGN KEY(Recordid) REFERENCES Chapters(Recordid) ON DELETE CASCADE)"
If Not DatabaseUpdate(DatabaseHandle.i, DatabaseUpdate.s)
Debug DatabaseError()
EndIf
Else
MessageRequester("Database open error", "Could not open database file in database mode.", #PB_MessageRequester_Ok)
EndIf
;
Else
;
MessageRequester("Database open error", "Could not open or create raw database file.", #PB_MessageRequester_Ok)
;
EndIf
;
EndProcedure
;================================================================================================================================================================================
; Count the number of records in an SQLite database
;================================================================================================================================================================================
Procedure.s CountRecords(TableField.s, TableName.s)
;
QueryString.s + "Select COUNT(" + TableField.s + ") AS totalrecs FROM " + TableName.s + ""
; Get the count of the records in the database
If DatabaseQuery(DatabaseHandle.i, QueryString.s) <> 0
If FirstDatabaseRow(DatabaseHandle.i)
NumberOfRecords.s = GetDatabaseString(DatabaseHandle.i, 0)
EndIf
FinishDatabaseQuery(DatabaseHandle.i)
Else
NumberOfRecords.s = "0"
EndIf
;
ProcedureReturn NumberOfRecords.s
;
EndProcedure
;==============================================================================================================================================================================
;
;==============================================================================================================================================================================
Procedure InsertDummyData()
DatabaseUpdate.s = "INSERT INTO Chapters("
DatabaseUpdate.s + "Chaptername, "
DatabaseUpdate.s + "Description, "
DatabaseUpdate.s + "Createdon) "
DatabaseUpdate.s + "VALUES("
DatabaseUpdate.s + "'Tricia''s Southern Kitchen', "
DatabaseUpdate.s + "'Country cooking at its'' finest', "
DatabaseUpdate.s + "1467291007)"
DatabaseUpdate(DatabaseHandle.i, DatabaseUpdate.s)
DatabaseUpdate.s = "INSERT INTO Chapters("
DatabaseUpdate.s + "Chaptername, "
DatabaseUpdate.s + "Description, "
DatabaseUpdate.s + "Createdon) "
DatabaseUpdate.s + "VALUES("
DatabaseUpdate.s + "'Rob''s Burgers', "
DatabaseUpdate.s + "'Heart attack food, beware!', "
DatabaseUpdate.s + "1467291009)"
DatabaseUpdate(DatabaseHandle.i, DatabaseUpdate.s)
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Chickens', '', 1)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Chickens', 'Boiled', 1)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Chickens', 'Roasted', 1)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Chickens', 'Grilled', 1)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Beef', '', 1)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Pork', '', 1)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Pork', 'Wild', 1)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Seafood', '', 1)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Seafood', 'Lobster', 1)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Seafood', 'Crayfish', 1)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Seafood', '', 2)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Seafood', 'Marinara', 2)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Onions', '', 2)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Onions', 'Boiled', 2)")
DatabaseUpdate(DatabaseHandle.i, "INSERT INTO ChapterCategories (Category, Subcategory, Recordid) VALUES ('Onions', 'Caramelised', 2)")
EndProcedure
;==============================================================================================================================================================================
;
;==============================================================================================================================================================================
Procedure GetDummyData()
DatabaseQuery.s = "SELECT m.Chaptername, n.Categoryid, n.Category, n.Subcategory "
DatabaseQuery.s + "FROM Chapters AS m, ChapterCategories AS n "
DatabaseQuery.s + "ORDER BY Chaptername, Category, SubCategory"
;
If DatabaseQuery(DatabaseHandle.i, DatabaseQuery.s)
While NextDatabaseRow(DatabaseHandle.i)
Chaptername.s = ReplaceString(GetDatabaseString(DatabaseHandle.i, 0), "''", "'")
Categoryid.s = GetDatabaseString(DatabaseHandle.i, 1)
Category.s = ReplaceString(GetDatabaseString(DatabaseHandle.i, 2), "''", "'")
SubCategory.s = ReplaceString(GetDatabaseString(DatabaseHandle.i, 3), "''", "'")
Debug "Chapter name: " + Chaptername.s + ", Category: " + Category.s + ", SubCategory: " + SubCategory.s
Wend
FinishDatabaseQuery(DatabaseHandle.i)
Else
MessageRequester("Error", "Failed to return any categories: " + DatabaseError(), #PB_MessageRequester_Ok)
EndIf
;
EndProcedure
;==============================================================================================================================================================================
;
;==============================================================================================================================================================================
OpenMasterRecipebook()
InsertDummyData()
GetDummyData()