在Android应用程序中使用SQLite数据库以及怎么用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Android应用程序中使用SQLite数据库以及怎么用相关的知识,希望对你有一定的参考价值。

参考技术A 其主要思路是:
1.
把数据库分解成几个asset文件。
2.
当需要打开数据库时,如果数据库不存在,就把那几个asset文件重新合并成一个数据库文件。
3.
如果数据库的版本改变了,就在onUpgrade()方法中把数据库文件删除掉。
下面是代码:
//数据库的缺省路径
private
static
finalString
DB_PATH
=
"/data/data/com.mypackage.myapp/databases/";
private
static
finalString
DB_NAME
=
"mydb.db";
private
static
finalint
DB_VERSION
=
2;
private
static
finalString
DB_SPLIT_NAME
=
"mydb.db.00";
private
static
finalint
DB_SPLIT_COUNT
=
3;
private
SQLiteDatabasem_database;
private
final
Contextm_context;
/**
*
Constructor
*保存传进来的context参数以用来访问应用的asset和资源文件。
*
@param
context
*/
public
MyDB(Contextcontext)

super(context,
DB_NAME,
null,
DB_VERSION);
this.m_context
=
context;

public
static
MyDBopenDatabaseReadOnly(Context
context)

MyDB
db
=
new
MyDB(context);
try

db.createDataBase();

catch
(IOException
e)

//
TODO
Auto-generated
catch
block
e.printStackTrace();

db.openDataBase(SQLiteDatabase.OPEN_READONLY);
return
db;

public
static
MyDBopenDatabaseReadWrite(Context
context)

MyDB
db
=
new
MyDB(context);
try

db.createDataBase();

catch
(IOException
e)

//
TODO
Auto-generated
catch
block
e.printStackTrace();

db.openDataBase(SQLiteDatabase.OPEN_READWRITE);
return
db;

/**
*创建一个空数据库,用来存储已有的数据库。
*/
public
voidcreateDataBase()
throws
IOException
boolean
dbExist
=checkDataBase();
if
(dbExist)

/*
**如果自己的数据库的版本改变了,调用这个方法确保在onUpgrade()被调用时
**传进去的是可写的数据库。
*/
SQLiteDatabase
db
=this.getWritableDatabase();
if
(db
!=
null)

db.close();


dbExist
=
checkDataBase();
if
(!dbExist)

try

/*
**
调用这个方法以确保在缺省路径内产生一个空数据库,以便在其基础上复制咱们已有的数据库。
*/
SQLiteDatabase
db
=this.getReadableDatabase();
if
(db
!=
null)

db.close();

copyDataBase();

catch
(IOException
e)

Log.e("DB",
e.getMessage());
throw
new
Error("Error
copyingdatabase");



/**
*
检查数据库是否已存在,以避免重复复制。
*
@return
true
if
it
exists,
false
if
itdoesn't
*/
private
static
booleancheckDataBase()
SQLiteDatabase
checkDB
=
null;
try

String
path
=
DB_PATH
+
DB_NAME;
checkDB
=SQLiteDatabase.openDatabase(path,
null,
SQLiteDatabase.OPEN_READONLY);

catch
(SQLiteException
e)
//database
does't
exist
yet.

if
(checkDB
!=
null)

checkDB.close();

return
checkDB
!=
null
?
true
:
false;

/**
*
把存在asset文件中的数据库复制的刚创建的空数据库中。
*
*/
private
voidcopyDataBase()
throws
IOException

//
刚创建的空数据库的路径
String
outFileName
=
DB_PATH
+
DB_NAME;
//
打开空数据库
OutputStream
output
=
new
FileOutputStream(outFileName);
byte[]
buffer
=
new
byte[1024*8];
AssetManager
assetMgr
=m_context.getAssets();
for
(int
i
=
1;
i
<=
DB_SPLIT_COUNT;
i++)
//
打开分解的asset文件
String
fn
=
DB_SPLIT_NAME
+String.valueOf(i);
InputStream
input
=
assetMgr.open(fn);
//Log.i("DB",
"opened"
+
fn);
int
length;
while
((length
=
input.read(buffer))
>0)

//Log.i("DB",
"read"
+
String.valueOf(length));
output.write(buffer,
0,
length);
//Log.i("DB",
"write"
+
String.valueOf(length));

input.close();

//Close
the
streams
output.flush();
output.close();

/**

如何在android中使用游标(sqlite查询)搜索数据库

我是一个Android初学者。我正在尝试设计这个简单的应用程序,它使用editText视图从用户获取城市名称,比较数据库中的城市名称,并返回该城市的邮政编码。现在,我遇到了游标实现的问题。请帮忙。如何查询数据库以获取相应的代码。

        EditText city;
    Button add,show1;
    RadioGroup choose;
    String k;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        try
        {   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //final ContentValues values = new ContentValues();
        city=(EditText)findViewById(R.id.editText1);
        add=(Button)findViewById(R.id.add);
        choose=(RadioGroup)findViewById(R.id.radio01);
        show1=(Button)findViewById(R.id.button1);
        k=city.getText().toString();
        createDatabase();
    }
        catch(Exception e)
        {

        }


show1.setOnClickListener(new View.OnClickListener() {


    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        db=openOrCreateDatabase(DATABASE_NAME,Context.MODE_PRIVATE,null);
        try{

        if(k == "CITY")
        {
            String[] result_columns=new String[]{"_id","CITY","CODE"};
            Cursor cursor = db.query(TABLE_NAME, result_columns, 
                    "CITY" +"=?", new String[]{"k"}, null, null, null);

    cursor.moveToFirst();

        String xnewcode=cursor.getString(0);
        Toast.makeText(activity1.this, xnewcode, Toast.LENGTH_LONG).show();
        cursor.moveToNext();

            //db.close();
        }}
        catch(Exception e)
        {
            Toast.makeText(activity1.this,"Fault in showing " + e,Toast.LENGTH_LONG).show();

        }

    }

});
答案
 Cursor   mCursor = db.rawQuery("select ZIPCODE from TABLENAME where CITYNAME= ? ", new String[]{"NEWYORK"});

希望你只得到单一的结果。

然后从(字符串意味着)mCursor.getString(coloumn_id)得到它

另一答案

我想你忘记了循环结果

String[] result_columns=new String[]{"_id","CITY","CODE"};
        Cursor cursor = db.query(TABLE_NAME, result_columns, 
                "CITY" +"=?", new String[]{"k"}, null, null, null);

do {

                        String xnewcode = cursor.getString(0);
                        System.ouot.println("...display the result..."+xnewcode);
                    }while (cursor.moveToNext());
                    }

看看Sample project

要么

关于sqlite database for android的教程

谢谢迪帕克

另一答案

我想你已经忘记了一些检查。但是,它实际上取决于编写城市的语言 - SQLite运算符“LIKE”仅对英文字母不区分大小写。如果您的城市使用其他语言,请考虑将它们以大写/小写形式存储在数据库中,并将输入字符串转换为java(String.toUpper / LowerCase())中的大写/小写。

String[] result_columns=new String[]{"_id","CITY","CODE"};
        Cursor cursor = db.query(TABLE_NAME, result_columns, 
                "CITY" +" like '%?%'", new String[]{"k"}, null, null, null);

if(cursor != null)
{
  while(cursor.moveToNext())
  {
    String xnewcode=cursor.getString(1);
    Toast.makeText(activity1.this, xnewcode, Toast.LENGTH_LONG).show();
  }
}

您可以将所有结果存储在一个数组中,并将其显示给用户,要求他选择正确的结果。

编辑:如果您不熟悉,“x LIKE Y”语句将x与Y中任何子字符串进行比较,长度为x = length。这非常有用,因为您无法保证用户将输入整个城市名称。因此,如果用户输入“york”,我的示例中,Cursor将返回“new york”,“yorkshire”,“york”等值。

另一答案
Cursor cursor = db.rawQuery("select _id,city,code 
      FROM city where city_name like '"+s+"%' order by city", null);

s是搜索框中输入字符的字符串

使用下面的链接它在Android应用程序开发中非常有用。

http://samir-mangroliya.blogspot.in/2012/05/android-sectioned-listview-with-search_6865.html

以上是关于在Android应用程序中使用SQLite数据库以及怎么用的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中使用游标(sqlite查询)搜索数据库

解析本地数据存储以替代 Core Data (iOS) 和 SQLite (Android)

如何以编程方式从 Android 中删除 SQLite 数据库

Android Xamarin-使用SQLite时打开计划的通知会停止重复并崩溃

如何访问 Android 模拟器中的本地文件夹以检索 SQLite db?

Android 使用 SQLite 光标显示下一项或上一项