I have an existing database with the app name without ".db" extension at the end. Now the database created with DBFlow library adds ".db" extension at the end. How can specify that it shouldn't add the ".db" extension when creating database.
Or
If It can't do that then please tell me a way so that I can rename my existing database to have a ".db" extension before DBFlow creates the database.
Thanks in advance.
I tried following code and it worked.
File dbFile = getDatabasePath("db_name");
boolean renamed = dbFile.renameTo(new File(getDatabasePath("db_name").getParent(), "db_name.db"));
Log.d("Renamed", renamed+"");
Logcat outputs true
And I checked by using adb shell and it did work. If there is someother way to do it please add it.
Related
Using room in android for database. When I tried to see the data in sqlviewer then no tables found in database file
Myapp.db file is empty.
Data/data/packageName/databases/Myapp.db
Go to folder Data/data/packageName/databases/ There has to be three files .db, .db-shm, .db-wal, copy all three files to one location and then open your Myapp.db these two extra files are needed to open db file
in android studio 3.1.*
in tool window bar click on "Device File explorer" generally you can find this in bottom right corner of the screenn
open directory in data/data/your-application-package/databases
with new architecture 3 files is created in databases directory
your-database-name
your-database-name-shm
your-database-name-wal
you have to export all 3 in the same directory
then open first one file (that is with your-database-name only ) in any sqlite browser.
and now you can see all your data .......
your-database-name-shm
your-database-name-wal
these two extra files are needed to open db file
if you will open database file only, than you will not found any table in that file
Make sure your database is closed when you exit your app, which will ensure that all outstanding transactions are committed:
#Override
protected void onDestroy() {
super.onDestroy();
// close the primary database to ensure all the transactions are merged
MyAppDatabase.getInstance(getApplicationContext()).close();
}
Then you can copy the database off your device using the Device File Explorer in Android Studio (look under /data/data/<your app package name>/databases).
You are also able to force a WAL checkpoint instead of closing the database, but in my humble opinion this option is easier (unless you are trying to backup your database within the app programmatically or something like that) and closing databases is a good idea (even if it's not really mentioned in the Android Room documentation).
Read more about sqlite WAL here: https://www.sqlite.org/wal.html
I saved the whole folder and that's it, I could browse the table.
Once check your Database class,
#Database(entities = arrayOf(Test::class), version = 1, exportSchema = false)
abstract class MyDatabase:RoomDatabase() {
private var INSTANCE: MyDatabase? = null
abstract fun testDao(): TestDao
}
Here, MyDatabase is my Database class, Test is the table name and TestDao is the Dao class.
In my app I have to create a new SQL database each time a user does a specific action. Sometimes though I need to change the name of the db file but I don't see how I could do that. So instead I thought of creating a new database with the new name and transfer the old database's data into the new one.
So, to be more clear, I have database A with some data in it. I want to create database B with the same data as A. Any ideas how to do that?
See this question: instead of copy your database on SD Card, you can copy it in the same path of the original one and change the name of the new database.
Use the following path
path = "/data/data/<you package name>/databases/<your db>.db";
Get inputstream using above path, And create new file with <another name>.db on the same path.
then create outputstream using <another name>.db
and copy inputstream into outputstream.
then delete existing file... may solve your problem.
I would like to delete the database file from the Android file system programatically? Can I have a shell script launch adb which in turns runs a shell script in the Android space to do the database deletion? Can I get this done from within a JUnit test case (with a system() call)?
How do I delete an entire database in Android? I need to make the whole thing go away so I can test database creation. I can drop tables, but that's not enough. This is in the emulator, not on a phone.
Once you have your Context and know the name of the database, use:
context.deleteDatabase(DATABASE_NAME);
When this line gets run, the database should be deleted.
The SQLiteDatabase.deleteDatabase(File file) static method was added in API 16. If you want to write apps that support older devices, how do you do this?
I tried: file.delete();
but it messes up SQLiteOpenHelper.
Thanks.
NEVER MIND! I later realized you are using Context.deleteDatabase(). The Context one works great and deletes the journal too. Works for me.
Also, I found I needed to call SQLiteOpenHelp.close() before doing the delete, so that I could then use LoaderManager to recreate it.
It's easy just type from your shell:
adb shell
cd /data/data
cd <your.application.java.package>
cd databases
su rm <your db name>.db
Try:
this.deleteDatabase(path);
or
context.deleteDatabase(path);
context.deleteDatabase("database_name.db");
This might help someone. You have to mention the extension otherwise, it will not work.
Also from Eclipse you can use DDMS which makes it really easy.
Just make sure your emulator is running, and then switch to DDMS perspective in Eclipse. You'll have full access to the File Explorer which will allow you to go in and easily delete the entire database.
context.deleteDatabase(DATABASE_NAME); will delete the database only if all the connections are closed. If you are maintaining singleton instance for handling your database helper - it is easy to close the opened Connection.
Incase the databasehelper is used in multiple place by instantiating directly, the deleteDatabase + killProcess will do the job even if some connections are open. This can be used if the application scenario doesn't have any issues in restarting the app.
Delete old Db when uninstall the app.
Setting android:allowBackup="false" in the application tag in AndroidManifest.xml fixed the problem. It seems that for some weird reason the Android OS was restoring from a backup every time I deployed the app.
you can create a file object of current database path and then delete it as we delete file from folder
File data = Environment.getDataDirectory();
String currentDBPath = "/data/com.example.demo/databases/" + DATABASE_NAME;
File currentDB = new File(data, currentDBPath);
boolean deleted = SQLiteDatabase.deleteDatabase(currentDB);
I used Android database delete method and database removed successfully
public bool DeleteDatabase()
{
var dbName = "TenderDb.db";
var documentDirectoryPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
var path = Path.Combine(documentDirectoryPath, dbName);
return Android.Database.Sqlite.SQLiteDatabase.DeleteDatabase(new Java.IO.File(path));
}
I have used the following for "formatting" the database on device after I have changed the structure of the database in assets. I simply uncomment the line in MainActivity when I wanted that the database is read from the assets again. This will reset the device database values and structure to mach with the preoccupied database in assets folder.
//database initialization. Uncomment to clear the database
//deleteDatabase("questions.db");
Next, I will implement a button that will run the deleteDatabase so that the user can reset its progress in the game.
If you are going to delete Table or Database , this way is worked:
1- Delete Table - It means keep Database but clean data from a table
* Just in DataHelper class add
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("delete from " + TABLE_NAME);
2- Delete Database - It means clean all records but keep file name
In the Activity
myDb = new DbHelper(this);
myDb.close();
myDb.delAll(getApplicationContext());
recreate();
In DataHelper class add
public void delAll(Context context) {
context.deleteDatabase(DB_NAME);
}
From Application Manager, you can delete whole application with data. Or just data by it self. This includes database.
Navigate to Settings. You can get to the settings menu either in
your apps menu or, on most phones, by pulling down the notification
drawer and tapping a button there.
Select the Apps submenu. On some phones this menu will have a
slightly different name such as Application Manager.
Swipe right to
the All apps list. Ignore the lists of Running and Downloaded apps.
You want the All apps list.
Select the app you wish to disable. A properties screen appears with
a button for Force Stop on the upper left and another for either
Disable or Uninstall updates on the upper right side.
Delete data.
Hi im trying to read sqlite file which is placed in assets/databases folder
i followed this link to read data from sqlite file
http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
im getting error
no such table : while compiling
SELECT _id, name, address FROM
stores
Is there any permission i need to write in manifest to read sqlite file data?
Please let me know how i can solve this issue. Or else please give me any reference link to follow.
Thanks in advance
The way you'd want to do this is to make a new DBManager object that creates the database in its onCreate method--that way when the DatabaseHelper is first instantiated, the table will be created for you. Then you'd instantiate one and call getReadableDatabase() on it to get a DB object which you can then query.
This tutorial may help you more, it's more succinct and up to date: http://developer.android.com/guide/topics/data/data-storage.html#db
After that, to set up the list view in a ListActivity, you can call setListAdapter and pass in a SimpleCursorAdapter. Here's a tutorial on that: http://developer.android.com/guide/appendix/faq/commontasks.html#binding
Check if database already exists or not.
If you are running on emulator.
write following on terminal/shell:
adb shell
cd data/data/your package name(ex. com.android.etc)
ls
if there exists databases directory then may be database is created
cd databases
ls
it will show your database if exists;
sqlite3 "your db name"
then write
.tables
it will show the name of table if exist:
now write your query over here to check for errors for ex:
sqlite> SELECT _id, name, address FROM stores
hope it helps.....
and yes there are no as such required permissions for this.
I already have a SQLite database. I put it in the assets folder of my project. I read the Android documentation. It said that for all the databases in Android, the path is data/data/pack_name/database_name.
This confused me. I just placed it in the assets folder, so the path is data/data/assets/database_name?
The package name is not the project name, the package name is the namespace. From Anthony's link.
Remember to change the "YOUR_PACKAGE"
to your application package namespace
(i.e: com.examplename.myapp) in the
DB_PATH string.
For example, from the Hello World tutorial, the project name is HelloAndroid but the package name is com.example.helloandroid
If this application had a database, it would be stored at data/data/com.example.helloandroid/database
To see how it is for the other applications you can start your emulator. On the menu bar you have your avd's name (I think it stands for Android Virtual Device). On mine it s "avdessay:5554"
(On Linux) From command line, type:
adb -s emulator-5554 shell
You have to replace 5554 by whatever port you are using.
if you have the command prompt '#' you can type:
cd data/data
There, you will see that eveything is in a form of a package name.
More info here
When you create a database by utilizing the SQLiteDatabase or SQLiteOpenHelper classes, it creates the database in your data/data/package_name/database.
You can access that resource by using
InputStream myInput = myContext.getAssets().open(your_database_here);
Any other information, look at Using your own SQLite database in Android Applications
The package_name portion of the path, would be the name of your package. You can find the name of the package at the first line in your .java files.
As an example, my class starts with this at the top
package com.forloney.tracker;
So my database is in data/data/com.forloney.tracker/database folder.
Hope this makes sense.
#ScCrow I too followed this example and had the same problems you did until I realized I was not using the DataBaseHelper correctly (or rather it had a quirk I overlooked).
When you use your DatabaseHelper class in your activity, you have to make sure you call createDatabase first! If you look at the code for openDatabase it does NOT check to see if the database exists, so you either have to (attempt to) create the database in each activity you use it in, or modify the openDatabase method to check to make sure the db exists. The link posted does actually instruct you to use it this way but you (like me) may have glossed over that.
Bad:
DBAdapter db = new DBAdapter(this);
db.openDataBase(); //Bad! db not created yet!
Good:
DBAdapter db = new DBAdapter(this);
db.createDataBase(); //needs exception handling
db.openDataBase();
When I try to open my DB, I get "unable to open database file". I assume its not finding the DB and not some other programmer error. In the log I see the following which looks good to me.
sqllite3_open_v2("/data/data/com.isildo.HelloListView/databases/ListsDB" ...
This is the setup
private static String DB_PATH = "/data/data/com.isildo.HelloListView/databases/";
private static String DB_NAME = "ListsDB";
In my projects assets in the Package Explorer, I see the ListsDb database.
So I at least think I have it all correct. I am using the example at
[http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/]
In one of the posts here, someone offers a suggestion about setting some Assets parameters.
{no response to post there}
**To get an ASSETS folder into your APK:
In /nbproject/project.properties,
change assets.dir=
to
assets.dir=assets
assets.available=true
In /nbproject/build-impl.xml, there is line in the “if=assets.available” target that reads
that needs to be changed to**
Is this something we need to do, and if so, can we get a little better direction on the changes required. I could not find the places to make the suggested changes I looked at the project settings, and other things.
Yep, Im new to the environment, so I may just be not finding them. Im using Eclipse on windows.
In your DBAdapter.java, change the return type of openDatabase method to SQLiteDatabase.
When you access the database simply use SQLiteDatabase data = db.openDatabase(), where db is DBAdapter db = new DBAdapter(this).