gpt4 book ai didi

android - 在 sqlite3 数据库中插入 1000000 行

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:06 26 4
gpt4 key购买 nike

我想向数据库中插入 10,000,000 行,但是插入需要很长时间。

例如现在我正在尝试使用 2055 行,将此数据上传到数据库需要 3 分钟..而这个时间对于 2055 个条目来说太多了。

以下是我将数据插入数据库的方法:

      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 文件,并在解析时:

尝试{

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
}
}

所以这里就是逐行解析,然后调用insert方法将条目插入到数据库中..

但它太花时间了..我怎样才能提高它的性能??

最佳答案

快速举例说明为什么您应该做正确的事而不是“错误的”。这是在 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) {
}
}

bundle 在任何旧的 Activity 中,我们添加以下简单的测试方法:

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;
}

如您所见,这将导致每 20 个 INSERT 左右发生一次冲突。调用 InsertHelper#replace(..) 会导致 helper 在发生冲突时使用 INSERT OR REPLACE

现在,让我们在没有事务的情况下运行此测试代码。

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);
}

结果呢?如果没有事务,INSERT 需要 41072ms。对于交易,他们需要 940 毫秒。简而言之,FFS,开始使用 InsertHelper 和事务。

关于android - 在 sqlite3 数据库中插入 1000000 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10733023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com