I want to insert 10,00,000 rows into the database, but the it takes too long time time in insertion like.
e.g. Now I am trying it with 2055 rows and it takes 3 minutes to upload this data into the database.. and this time is too much for 2055 entries.
The following is my method of inserting the data into the database:
public void insert_database(Context context,String field1,String field2,String field3,String field4,String field5,String field6 ,String field7,String field8,String field9,String field10)
{
try
{
//RayAllen_Database.beginTransaction();
RayAllen_Database.execSQL(" insert or replace into "+ TableName_csv+" values( '"+field1+"' ,'"+field2+"','"+field3+"','"+field4+"','"+field5+"','"+field6+"','"+field7+"','"+field8+"','"+field9+"','"+field10+"');");
}
catch(Exception e)
{
//Log.i("Database Exception", "Exception");
e.printStackTrace();
}
}
and in the another class called: Parsing Data: here I am parsing the csv file and while parsing:
try {
CSVReader reader=new CSVReader(new FileReader(filename));
String [] nextLine;
//create database
obj.create_database(context);
obj.OpenDatabase(context);
//reader.readNext();
while ((nextLine=reader.readNext())!=null)
{
//here I am calling the insert_database function
}
}
so here It is parsing row one by one and calling the insert method to insert the entry into the database..
But it is too much time taking.. How can I improve the performance of this??
You could populate your database using offline tools and then import it when you install your package. You can either store the database in the external sd card or in the asset folder of your application.
This is how I do it:
Copy the application database to a local folder using the Android Debuger Bridge (adb) like this:
adb pull /data/data/<your application provider>/databases/yourdatbase.db C:/users/databases/yourdatbase.db
.Connect to the SQLites database
C:/users/databases/yourdatbase.db
with your favourite GUI/CLI tool and complete your population of the 1 000 000 records.Copy your populated database to your Android development environment
asset
folder.Now uninstall your application from the device to make sure there is no database created when you install for the first time.
Modify your SQLiteHepler class so that it checks if a database exists and if one exists it uses that one. If no database exists the Helper copies the one from your asset folder together with your 1 000 000 records. This is how I have done it:
This database will be compliled with you app and on first launch all the data will be there. There could be a simpler method, but I hope this helps someone.
Quick example time why you should do the right thing instead of "wrong". This was tested running on ICS 4.0.4, which has horrible INSERT-performance.
First, a simple
SQLiteOpenHelper
that creates a table with aUNIQUE
constraint on a column to cause conflicts now-and-then.Bundled in any old
Activity
we add the following simple test method:As you can see, this would cause a conflict every 20th
INSERT
or so. CallingInsertHelper#replace(..)
causes the helper to use aINSERT OR REPLACE
on conflicts.Now, let's run this test code with & without a transaction surrounding it.
Everything is started like this:
And the results? Without a transaction the
INSERT
s take 41072ms. With transactions they take 940ms. In short, FFS, start usingInsertHelper
s and transactions.Speeding up sqlite insert operations goes through a similar case and shows how to use transactions to optimize the insertion.