What is the best way to update sqlite schema and data on a software update?
up vote
0
down vote
favorite
I'm including an SQLite database in a recent application I'm designing. This will sit in the application folder and will contain a mixture of stock and user data. It's being developed via .net and entity framework.
I'm wanting to know how to approach updating this database between application updates (say adding tables and fields) whilst also preserving user data client-side when the user updates the application. I'm assuming that if I just change the database schema and data development side and then just overwrite to client side .db file on update, then you'll loose all of the user data.
Any suggestions?
.net entity-framework sqlite
add a comment |
up vote
0
down vote
favorite
I'm including an SQLite database in a recent application I'm designing. This will sit in the application folder and will contain a mixture of stock and user data. It's being developed via .net and entity framework.
I'm wanting to know how to approach updating this database between application updates (say adding tables and fields) whilst also preserving user data client-side when the user updates the application. I'm assuming that if I just change the database schema and data development side and then just overwrite to client side .db file on update, then you'll loose all of the user data.
Any suggestions?
.net entity-framework sqlite
You mentioned that you are using Entity Framework, EF has "migrations" feature which allow you to keep target database in sync and have a history of changes.
– Fabio
Nov 19 at 23:20
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I'm including an SQLite database in a recent application I'm designing. This will sit in the application folder and will contain a mixture of stock and user data. It's being developed via .net and entity framework.
I'm wanting to know how to approach updating this database between application updates (say adding tables and fields) whilst also preserving user data client-side when the user updates the application. I'm assuming that if I just change the database schema and data development side and then just overwrite to client side .db file on update, then you'll loose all of the user data.
Any suggestions?
.net entity-framework sqlite
I'm including an SQLite database in a recent application I'm designing. This will sit in the application folder and will contain a mixture of stock and user data. It's being developed via .net and entity framework.
I'm wanting to know how to approach updating this database between application updates (say adding tables and fields) whilst also preserving user data client-side when the user updates the application. I'm assuming that if I just change the database schema and data development side and then just overwrite to client side .db file on update, then you'll loose all of the user data.
Any suggestions?
.net entity-framework sqlite
.net entity-framework sqlite
asked Nov 19 at 22:44
stigzler
62217
62217
You mentioned that you are using Entity Framework, EF has "migrations" feature which allow you to keep target database in sync and have a history of changes.
– Fabio
Nov 19 at 23:20
add a comment |
You mentioned that you are using Entity Framework, EF has "migrations" feature which allow you to keep target database in sync and have a history of changes.
– Fabio
Nov 19 at 23:20
You mentioned that you are using Entity Framework, EF has "migrations" feature which allow you to keep target database in sync and have a history of changes.
– Fabio
Nov 19 at 23:20
You mentioned that you are using Entity Framework, EF has "migrations" feature which allow you to keep target database in sync and have a history of changes.
– Fabio
Nov 19 at 23:20
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
You basically need something to compare against in the live database against the new.
e.g. if adding a table then you could use SELECT * FROM sqlite_master WHERE name = your_new_table_name
to see if the table already exists. However you could use the simpler CREATE TABLE IF NOT EXISTS ........
New columns, with limitations, you could use ALTER TABLE your_existing_tablename ADD COLUMN you_new_column_definition
(existing data is kept, if provided a default value will be applied).
Limitations are :-
- The column may not have a PRIMARY KEY or UNIQUE constraint.
- The column may not have a default value of CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP, or an expression in parentheses.
- If a NOT NULL constraint is specified, then the column must have a default value other than NULL.
If foreign key constraints are enabled and a column with a REFERENCES clause is added, the column must have a default value of
NULL.
- Note also that when adding a CHECK constraint, the CHECK constraint is not tested against preexisting rows of the table. This can result in a table that contains data that is in violation of the CHECK constraint. Future versions of SQLite might change to validate CHECK constraints as they are added.
SQL As Understood By SQLite - ALTER TABLE
If the column already exists then the result would include a message saying that the column is a duplicate e.g. :-
ALTER TABLE ex01 ADD COLUMN col5 TEXT
> duplicate column name: col5
> Time: 0s
You could always extract the existing columns using PRAGMA table_info(your_existing_table_name);
and only proceed if the column to be added is not one of the values in the name column of the result set.
- Note that the link above suggests other ways to handle more complex situations.
With Android the stock SQLiteDatabase methods utilise the user_version (bytes 60 63in the database header).) to hold the actual version of the database which is compared against a provided value. If the provided value is greater then the onUpgrade method is invoked.
PRAGMA Statements
Database File Format
P.S. Asking Best can be lead to opinion based responses, sometimes casuing heated arguments and thus asking for the Best should be avodied. Rather ask for ways.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53383720%2fwhat-is-the-best-way-to-update-sqlite-schema-and-data-on-a-software-update%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
You basically need something to compare against in the live database against the new.
e.g. if adding a table then you could use SELECT * FROM sqlite_master WHERE name = your_new_table_name
to see if the table already exists. However you could use the simpler CREATE TABLE IF NOT EXISTS ........
New columns, with limitations, you could use ALTER TABLE your_existing_tablename ADD COLUMN you_new_column_definition
(existing data is kept, if provided a default value will be applied).
Limitations are :-
- The column may not have a PRIMARY KEY or UNIQUE constraint.
- The column may not have a default value of CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP, or an expression in parentheses.
- If a NOT NULL constraint is specified, then the column must have a default value other than NULL.
If foreign key constraints are enabled and a column with a REFERENCES clause is added, the column must have a default value of
NULL.
- Note also that when adding a CHECK constraint, the CHECK constraint is not tested against preexisting rows of the table. This can result in a table that contains data that is in violation of the CHECK constraint. Future versions of SQLite might change to validate CHECK constraints as they are added.
SQL As Understood By SQLite - ALTER TABLE
If the column already exists then the result would include a message saying that the column is a duplicate e.g. :-
ALTER TABLE ex01 ADD COLUMN col5 TEXT
> duplicate column name: col5
> Time: 0s
You could always extract the existing columns using PRAGMA table_info(your_existing_table_name);
and only proceed if the column to be added is not one of the values in the name column of the result set.
- Note that the link above suggests other ways to handle more complex situations.
With Android the stock SQLiteDatabase methods utilise the user_version (bytes 60 63in the database header).) to hold the actual version of the database which is compared against a provided value. If the provided value is greater then the onUpgrade method is invoked.
PRAGMA Statements
Database File Format
P.S. Asking Best can be lead to opinion based responses, sometimes casuing heated arguments and thus asking for the Best should be avodied. Rather ask for ways.
add a comment |
up vote
0
down vote
You basically need something to compare against in the live database against the new.
e.g. if adding a table then you could use SELECT * FROM sqlite_master WHERE name = your_new_table_name
to see if the table already exists. However you could use the simpler CREATE TABLE IF NOT EXISTS ........
New columns, with limitations, you could use ALTER TABLE your_existing_tablename ADD COLUMN you_new_column_definition
(existing data is kept, if provided a default value will be applied).
Limitations are :-
- The column may not have a PRIMARY KEY or UNIQUE constraint.
- The column may not have a default value of CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP, or an expression in parentheses.
- If a NOT NULL constraint is specified, then the column must have a default value other than NULL.
If foreign key constraints are enabled and a column with a REFERENCES clause is added, the column must have a default value of
NULL.
- Note also that when adding a CHECK constraint, the CHECK constraint is not tested against preexisting rows of the table. This can result in a table that contains data that is in violation of the CHECK constraint. Future versions of SQLite might change to validate CHECK constraints as they are added.
SQL As Understood By SQLite - ALTER TABLE
If the column already exists then the result would include a message saying that the column is a duplicate e.g. :-
ALTER TABLE ex01 ADD COLUMN col5 TEXT
> duplicate column name: col5
> Time: 0s
You could always extract the existing columns using PRAGMA table_info(your_existing_table_name);
and only proceed if the column to be added is not one of the values in the name column of the result set.
- Note that the link above suggests other ways to handle more complex situations.
With Android the stock SQLiteDatabase methods utilise the user_version (bytes 60 63in the database header).) to hold the actual version of the database which is compared against a provided value. If the provided value is greater then the onUpgrade method is invoked.
PRAGMA Statements
Database File Format
P.S. Asking Best can be lead to opinion based responses, sometimes casuing heated arguments and thus asking for the Best should be avodied. Rather ask for ways.
add a comment |
up vote
0
down vote
up vote
0
down vote
You basically need something to compare against in the live database against the new.
e.g. if adding a table then you could use SELECT * FROM sqlite_master WHERE name = your_new_table_name
to see if the table already exists. However you could use the simpler CREATE TABLE IF NOT EXISTS ........
New columns, with limitations, you could use ALTER TABLE your_existing_tablename ADD COLUMN you_new_column_definition
(existing data is kept, if provided a default value will be applied).
Limitations are :-
- The column may not have a PRIMARY KEY or UNIQUE constraint.
- The column may not have a default value of CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP, or an expression in parentheses.
- If a NOT NULL constraint is specified, then the column must have a default value other than NULL.
If foreign key constraints are enabled and a column with a REFERENCES clause is added, the column must have a default value of
NULL.
- Note also that when adding a CHECK constraint, the CHECK constraint is not tested against preexisting rows of the table. This can result in a table that contains data that is in violation of the CHECK constraint. Future versions of SQLite might change to validate CHECK constraints as they are added.
SQL As Understood By SQLite - ALTER TABLE
If the column already exists then the result would include a message saying that the column is a duplicate e.g. :-
ALTER TABLE ex01 ADD COLUMN col5 TEXT
> duplicate column name: col5
> Time: 0s
You could always extract the existing columns using PRAGMA table_info(your_existing_table_name);
and only proceed if the column to be added is not one of the values in the name column of the result set.
- Note that the link above suggests other ways to handle more complex situations.
With Android the stock SQLiteDatabase methods utilise the user_version (bytes 60 63in the database header).) to hold the actual version of the database which is compared against a provided value. If the provided value is greater then the onUpgrade method is invoked.
PRAGMA Statements
Database File Format
P.S. Asking Best can be lead to opinion based responses, sometimes casuing heated arguments and thus asking for the Best should be avodied. Rather ask for ways.
You basically need something to compare against in the live database against the new.
e.g. if adding a table then you could use SELECT * FROM sqlite_master WHERE name = your_new_table_name
to see if the table already exists. However you could use the simpler CREATE TABLE IF NOT EXISTS ........
New columns, with limitations, you could use ALTER TABLE your_existing_tablename ADD COLUMN you_new_column_definition
(existing data is kept, if provided a default value will be applied).
Limitations are :-
- The column may not have a PRIMARY KEY or UNIQUE constraint.
- The column may not have a default value of CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP, or an expression in parentheses.
- If a NOT NULL constraint is specified, then the column must have a default value other than NULL.
If foreign key constraints are enabled and a column with a REFERENCES clause is added, the column must have a default value of
NULL.
- Note also that when adding a CHECK constraint, the CHECK constraint is not tested against preexisting rows of the table. This can result in a table that contains data that is in violation of the CHECK constraint. Future versions of SQLite might change to validate CHECK constraints as they are added.
SQL As Understood By SQLite - ALTER TABLE
If the column already exists then the result would include a message saying that the column is a duplicate e.g. :-
ALTER TABLE ex01 ADD COLUMN col5 TEXT
> duplicate column name: col5
> Time: 0s
You could always extract the existing columns using PRAGMA table_info(your_existing_table_name);
and only proceed if the column to be added is not one of the values in the name column of the result set.
- Note that the link above suggests other ways to handle more complex situations.
With Android the stock SQLiteDatabase methods utilise the user_version (bytes 60 63in the database header).) to hold the actual version of the database which is compared against a provided value. If the provided value is greater then the onUpgrade method is invoked.
PRAGMA Statements
Database File Format
P.S. Asking Best can be lead to opinion based responses, sometimes casuing heated arguments and thus asking for the Best should be avodied. Rather ask for ways.
answered Nov 19 at 23:14
MikeT
14.2k102441
14.2k102441
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53383720%2fwhat-is-the-best-way-to-update-sqlite-schema-and-data-on-a-software-update%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
You mentioned that you are using Entity Framework, EF has "migrations" feature which allow you to keep target database in sync and have a history of changes.
– Fabio
Nov 19 at 23:20