Android 在sqlite3数据库中插入1000000行
我想在数据库中插入10,00000行,但是插入时需要的时间太长了 e、 g.现在我正在用2055行进行尝试,将这些数据上传到数据库需要3分钟。。这一次对于2055个参赛者来说太多了 以下是我将数据插入数据库的方法:Android 在sqlite3数据库中插入1000000行,android,sqlite,Android,Sqlite,我想在数据库中插入10,00000行,但是插入时需要的时间太长了 e、 g.现在我正在用2055行进行尝试,将这些数据上传到数据库需要3分钟。。这一次对于2055个参赛者来说太多了 以下是我将数据插入数据库的方法: public void insert_database(Context context,String field1,String field2,String field3,String field4,String field5,String field6 ,String
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();
}
}
在另一个名为:解析数据的类中:这里我解析csv文件,同时解析:
试一试{
因此,这里它逐个解析行,并调用insert方法将条目插入数据库
但是这太费时了。如何提高性能???经历了一个类似的案例,并展示了如何使用事务优化插入。您可以使用脱机工具填充数据库,然后在安装软件包时导入。您可以将数据库存储在外部sd卡或应用程序的资产文件夹 我就是这样做的:
adb pull/data/data//databases/yourdabase.db C:/users/databases/yourdabase.db
C:/users/databases/yourdatbase.db
,并完成1000 000条记录的填充asset
文件夹中public class MyDatabaseHelper extends SQLiteOpenHelper {
/*
Other SQLiteOpenHelper declarations here ...
*/
private static final String DATABASE_NAME = "application.db";
private static final String DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
/*
Your SQLiteOpenHelper functions/procedures here ...
*/
public boolean isDataBaseExist() {
File dbFile = new File(DB_PATH + DATABASE_NAME);
return dbFile.exists();
}
public void copyDataBase(Context context) throws IOException {
this.getReadableDatabase();
InputStream inFile = context.getResources().getAssets().open(DATABASE_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DATABASE_NAME;
OutputStream outFile = new FileOutputStream(outFileName);
// transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = inFile.read(buffer)) > 0) {
outFile.write(buffer, 0, length);
}
// Close the streams
outFile.flush();
outFile.close();
inFile.close();
}
此数据库将与您的应用程序一起编译,在第一次启动时,所有数据都将在那里。可能有一个更简单的方法,但我希望这对某人有所帮助。快速示例时间为什么您应该做正确的事情而不是“错误”。这是在ICS 4.0.4上运行的测试,它具有可怕的插入性能 首先,一个简单的
SQLiteOpenHelper
,它在一个列上创建一个带有UNIQUE
约束的表,以时不时地引起冲突
class SimpleHelper extends SQLiteOpenHelper {
// InsertHelpers are a really good idea - they format a prepared statement
// for you automatically.
InsertHelper mInsert;
public SimpleHelper(Context context) {
super(context, "tanika.db", null, 1);
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
mInsert = new InsertHelper(db, "target");
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE target (\n" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" +
"val1 TEXT NOT NULL,\n" +
"val2 TEXT NOT NULL,\n" +
"val3 TEXT NOT NULL,\n" +
// Let's make one unique so we can get some juicy conflicts
"val4 TEXT NOT NULL UNIQUE\n" +
")");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
捆绑在任何旧的活动中
我们添加了以下简单的测试方法:
long test(final int n) {
long started = System.currentTimeMillis();
ContentValues values = new ContentValues();
for (int i = 0; i < n; i++) {
values.clear();
// Every 20th insert, generate a conflict in val4
String val4 = String.valueOf(started + i);
if (i % 20 == 0) {
val4 = "conflict";
}
values.put("val1", "Value1");
values.put("val2", "Value2");
values.put("val3", "Value3");
values.put("val4", val4);
mHelper.mInsert.replace(values);
}
return System.currentTimeMillis() - started;
}
一切都是这样开始的:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHelper = new SimpleHelper(this);
mHelper.getWritableDatabase(); // Forces the helper to initialize.
new Test1().execute(2055);
new Test2().execute(2055);
}
结果如何?如果没有事务,
INSERT
s需要41072ms。如果事务需要940ms。简言之,FFS,开始使用InsertHelper
s和事务。准备一条语句,并将其用于会话中的所有插入。这将加快速度。您有理由解析CSV并填充吗设备上的DB?是否可以脱机执行?但我正在获取csv文件,因此我需要逐行读取它以将其保存到database@SarwarErfan:你能给我一个preparedStatement的例子吗?插入1000万行对于一个简单的智能手机来说是一件很难处理的事情…CSV文件是在哪里创建的?你能复制/创建SQLite数据吗在服务器上使用ase并发送一个准备运行的数据库?InsertHelper不推荐使用。在android中是否有其他方法可以更快地插入数据库。
class Test1 extends AsyncTask<Integer, Void, Long> {
@Override
protected Long doInBackground(Integer... params) {
return test(params[0]);
}
@Override
protected void onPostExecute(Long result) {
System.out.println(getClass().getSimpleName() + " finished in " + result + "ms");
}
}
class Test2 extends AsyncTask<Integer, Void, Long> {
protected Long doInBackground(Integer... params) {
SQLiteDatabase db = mHelper.getWritableDatabase();
db.beginTransaction();
long started = System.currentTimeMillis();
try {
test(params[0]);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
return System.currentTimeMillis() - started;
}
@Override
protected void onPostExecute(Long result) {
System.out.println(getClass().getSimpleName() + " finished in " + result + "ms");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHelper = new SimpleHelper(this);
mHelper.getWritableDatabase(); // Forces the helper to initialize.
new Test1().execute(2055);
new Test2().execute(2055);
}