手机j2me应用程序的数据是缓存在 rms数据库中的,
但手机wap网页上的数据是缓存在cookie中的
电脑上的web网页数据不是数据库存储的,而是缓存在cookie中的
当web网页与web后台交互时,数据才由后台程序存储在后台的数据库中。
j2me,wap,web都是客户端,都不能存储真正的数据库(j2me除外,rms也不算是真正意义上的数据库)
数据库都是应该存在后台的。
另外,团IDC网上有许多产品团购,便宜有口碑
MediaProvider实现了 ContentProvider类的几个 *** 作SQL的重要方法如insert ,delete, updata, query。MediaProvider中DatabaseHelper类用于获取与创建Database。private static final class DatabaseHelper extends SQLiteOpenHelper {final Context mContext;final boolean mInternal; // True if this is the internal database// In memory caches of artist and album dataHashMap< String, Long> mArtistCache = new HashMap< String, Long>();HashMap< String, Long> mAlbumCache = new HashMap< String, Long>();public DatabaseHelper(Context context, String name, boolean internal) {super(context, name, null, DATABASE_VERSION);mContext = context;mInternal = internal;}/ Creates database the first time we try to open it/@Override //第一次打开数据库时创建Tablepublic void onCreate(final SQLiteDatabase db) {updateDatabase(db, mInternal, 0, DATABASE_VERSION);}以Camera的image文件文件为例,数据库在第一次使用的时候被创建,对于image文件,SQL在updateDatabase为其创建一个table:dbexecSQL("CREATE TABLE IF NOT EXISTS images (" +"_id INTEGER PRIMARY KEY," + //文件保存的序号"_data TEXT," + //记录image 文件保存路径"_size INTEGER," + //文件大小"_display_name TEXT," + //名称"mime_type TEXT," + //文件类型"title TEXT," +"date_added INTEGER," +"date_modified INTEGER," +"description TEXT," +"picasa_id TEXT," +"isprivate INTEGER," +"latitude DOUBLE," +"longitude DOUBLE," +"datetaken INTEGER," +"orientation INTEGER," +"mini_thumb_magic INTEGER," +"bucket_id TEXT," +"bucket_display_name TEXT" +");");添加URI到match这个也很重要,因为不同类型的文件会保存在不同的table中,如果我们得到一个URI为: content://media/external/images/media/1 通过UriMatchermatch(uri)将返回注册的IMAGES_MEDIA_ID值。URI_MATCHERaddURI("media", "/images/media", IMAGES_MEDIA);URI_MATCHERaddURI("media", "/images/media/#", IMAGES_MEDIA_ID);URI格式解析如下:URI格式中最重要的字段是authority,authority确定了 *** 作数据库的Provider是由谁提供的。MediaProvider在AndroidManifestxml中添加如下语句:< provider android:name="MediaProvider" android:authorities="media"android:multiprocess="false" />Provider加载MediaProvider安装在手机中,ContentResolver通过acquireProvider请求加载Provider程序。acquireProvider正是通过解析URI中的authority字段,在安装的package中查找与此authority相符的Provider,如果此Provider没有被加载ActivityMangerService将加载Provider程序,这个过程可以参考我以前写的Activity是如何加载的文章。 Provider到底是加载到调用Provider的应用程序还是将Provider程序加载到ActivityManagerService中作为 system Provider这个我不太确定是如何区分的,反正这两种方式都是可行的,总之按照sdk help 文档上的方式创建Provider程序,android会自动加载的。记录的保存与获取当Camera拍照完成或者是media play文件需要保存的时候,首先要构造保存的数据结构ContentValues values = new ContentValues(7);valuesput(ImagesMediaTITLE, imageName);valuesput(ImagesMediaDISPLAY_NAME, imageName);valuesput(ImagesMediaDESCRIPTION, description);valuesput(ImagesMediaDATE_TAKEN, dateTaken);valuesput(ImagesMediaMIME_TYPE, "image/jpeg");valuesput(ImagesMediaORIENTATION, orientation);Uri uri = crinsert(sStorageURI, values); //保存到数据库sStorageURI == content://media/external/sdcard/media/Authority是 media所以将调用MediaProvider::insert,在insert中生成文件保存的路径并放在key为_data项数据区。再通过 ContentResolver访问MediaProvider调用openFile打开文件并将Image或media数据写入。Camera,Image gallery应用启动后不会扫描文件系统而是根据数据库的记录来进行列表并显示。这样做无疑效率比较高。文件的删除数据库中保存有文件的路径名,当调用delete从数据库中删除一个记录后,记录中_data保存的文件名(绝对路径)所指的文件也被删除了。而在应用程序中是找不到删除文件的代码,这个困扰了我两天,在程序中加log,分析源代码,最终屏蔽MediaProvider中的一段代码找到了一点线索:public int delete(Uri uri, String userWhere, String[] whereArgs) {int count;int match = URI_MATCHERmatch(uri);……………………………if (match != VOLUMES_ID) {DatabaseHelper database = getDatabaseForUri(uri);if (database == null) {throw new UnsupportedOperationException("Unknown URI: " + uri);}SQLiteDatabase db = databasegetWritableDatabase();synchronized (sGetTableAndWhereParam) {getTableAndWhere(uri, match, userWhere, sGetTableAndWhereParam);switch (match) {case AUDIO_MEDIA:case AUDIO_MEDIA_ID:count = dbdelete("audio_meta",sGetTableAndWhereParamwhere, whereArgs);break;default:// count = dbdelete(sGetTableAndWhereParamtable,// sGetTableAndWhereParamwhere, whereArgs);break;}getContext()getContentResolver()notifyChange(uri, null);}}……………………}将上面红色代码注掉以后发现文件没有被删除,而红色代码只是对数据库进行 *** 作,因而文件应该是在清除数据库的记录时候被删除的。仔细查看创建table的代码发现几个语句很奇怪,由于没有网络去搜索一下关于android SQL的knowledge 只能猜测这个语句的意思了当然也怪偶没去学学SQL。
dbexecSQL("CREATE TRIGGER IF NOT EXISTS images_cleanup DELETE ON images " +"BEGIN " +"DELETE FROM thumbnails WHERE image_id = old_id;" +"SELECT _DELETE_FILE(old_data);" +"END");创建table为 images的触发器,DELETE FROM thumbnails WHERE image_id = old_id正是删除thumbnails的意思,对于Camera创建的Images会生成一个小保存为thumbnail,这个记录也是自动清除的。 "SELECT _DELETE_FILE(old_data);" 应该是删除文件的意思。在Sqlite3_androidcpp文件中还真找到delete_file这个函数,加上log,进入gallery选择一个文件删除,打出了删除文件名的全路径。static void delete_file(sqlite3_context context, int argc, sqlite3_value argv){…………………if (strncmp("/sdcard/", path, 8) != 0) { //只能删除sdcard/路径下的东西要删除其他路sqlite3_result_null(context); //还需稍微改造一下return;}……………………}如何将文件保存在手机上MediaProvider中存在两个数据库一个是external对应文件系统为SD Card, 一个是内部数据库internal用于手机flash上的文件系统。遗憾的是虽然MediaProvider提供了 *** 作内外两个数据库的功能,但在发布的应用中并没有使用这个内部文件系统。Android 默认状态下Image,audio等文件是保存在SD card上。External, internal 数据库都保存在手机文件系统上Path: /data/data/comandroidprovidersmedia/database/如果要使用内部文件系统需要修改以下几个地方1:MediaProvider generateFileName函数private String generateFileName(boolean internal, String preferredExtension, String directoryName){// create a random fileString name = StringvalueOf(SystemcurrentTimeMillis());if (internal) {throw new UnsupportedOperationException("Writing to internal storage is not supported");// return EnvironmentgetDataDirectory()// + "/" + directoryName + "/" + name + preferredExtension;} else {return EnvironmentgetExternalStorageDirectory()+ "/" + directoryName + "/" + name + preferredExtension;}}恢复红色部分代码,将路径设置为手机内部文件系统文件夹。2:保存文件使用的URI为content://media/internal/images/media/1红色internal表名使用内部文件系统数据库3:修改Sqlite3_androidcpp中delete_file函数static void delete_file(sqlite3_context context, int argc, sqlite3_value argv){…………………if (strncmp("/sdcard/", path, 8) != 0 && strncmp("/data/media/", path, 12)) {sqlite3_result_null(context);return;}……………………}添加红色部分,文件位于手机上/data/media路径时也进行删除。这样当我们从数据库里删除一条记录时,_data数据区存取的文件路径中的文件也将自动删除。
通常来说,一个android应用程序不止一个Activity(活动),更不止一个界面。于是需要创建多个Activity来满足应用程序的要求,这里我将告诉大家如何添加新的Activity,并实现Activity之间的切换,这里的两个活动以不同界面展示,活动的切换相当于界面的切换。
Android studio
Android手机或者安卓模拟器
首先创建一个Test项目工程,选择默认版式,选择好自己喜欢的主题(Theme)。
Android studio教程:[6]创建多个Activity
在文件管理器中找到layout下的xml文件,并将其复制粘贴一份到layout目录下,命名为second_activityxml。
Android studio教程:[6]创建多个Activity
接下来在java文件处新建一个java class,命名为SecondActivity。
Android studio教程:[6]创建多个Activity
Android studio教程:[6]创建多个Activity
此时可以看到文件目录中多出来一个xml文件和一个java类文件。
Android studio教程:[6]创建多个Activity
打开AndroidManifestxml文件,添加一个<activity></activity>标签,添加内容如下:
<activity
android:name="SecondActivity"
android:label="Second Activity">
<intent-filter>
<action android:name="comlitreilySecondActivity"/>
<category android:name="androidintentcategoryDEFAULT"/>
</intent-filter>
</activity>
Android studio教程:[6]创建多个Activity
修改SecondActivityxml:
<TextView
android:text="The Second Activity!"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Android studio教程:[6]创建多个Activity
修改SecondActivityjava文件:
public class SecondActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(RlayoutSecondActivity);
}
}
Android studio教程:[6]创建多个Activity
修改主界面的activity_myxml文件,添加一个按钮,用于跳转Activity:
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="转到下一个界面"
android:onClick="onClick"/>
Android studio教程:[6]创建多个Activity
在主界面的java类中实现按钮的点击事件响应函数onClick,通过startActivity函数打开新的Activity
public void onClick(View view)
{
startActivity(new Intent("comlitreilySecondActivity"));
}
Android studio教程:[6]创建多个Activity
设置采用模拟器打开App,并启动调试打开模拟器。
Android studio教程:[6]创建多个Activity
在模拟器中运行程序,点击按钮可以切换Activity,在第二个界面点击返回键可以返回主界面。
Android studio教程:[6]创建多个Activity
Android studio教程:[6]创建多个Activity
注意事项
xml文件的命名为小写字母或者数字,大写字母可能会报错
SQLite 创建表
下面是教程来自于android学习手册,android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳
SQLite 的 CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类型。
语法
CREATE TABLE 语句的基本语法如下:
CREATE TABLE database_nametable_name(
column1 datatype PRIMARY KEY(one or more columns),
column2 datatype,
column3 datatype,
columnN datatype,
);
CREATE TABLE 是告诉数据库系统创建一个新表的关键字。CREATE TABLE 语句后跟着表的唯一的名称或标识。您也可以选择指定带有table_name 的 database_name。
实例
下面是一个实例,它创建了一个 COMPANY 表,ID 作为主键,NOT NULL 的约束表示在表中创建纪录时这些字段不能为 NULL:
sqlite> CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
让我们再创建一个表,我们将在随后章节的练习中使用:
sqlite> CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
您可以使用 SQLIte 命令中的 tables 命令来验证表是否已成功创建,该命令用于列出附加数据库中的所有表。
sqlite>tables
COMPANY DEPARTMENT
在这里,可以看到我们刚创建的两张表 COMPANY、 DEPARTMENT。
您可以使用 SQLite schema 命令得到表的完整信息,如下所示:
sqlite>schema COMPANY
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
在其他数据库上作开发,一般都使用工具来检查和处理数据库的内容,而不是仅仅使用数据库的
API。使用
Android
模拟器,有两种可供选择的方法来管理数据库。
首先,模拟器绑定了
sqlite3
控制台程序,可以使用
adb
shell
命令来调用他。只要你进入了模拟器的
shell,在数据库的路径执行
sqlite3
命令就可以了。数据库文件一般存放在:
/data/data/yourapppackage/databases/your-db-name
如果你喜欢使用更友好的工具,你可以把数据库拷贝到你的开发机上,使用
SQLite-aware
客户端来 *** 作它。这样的话,你在一个数据库的拷贝上 *** 作,如果你想要你的修改能反映到设备上,你需要把数据库备份回去。
把数据库从设备上考出来,你可以使用
adb
pull
命令(或者在
IDE
上做相应 *** 作)。存储一个修改过的数据库到设备上,使用
adb
push
命令。
一个最方便的
SQLite
客户端是
FireFox
SQLite
Manager
扩展,它可以跨所有平台使用。
前端比较简单网上很多东西
后台 你要先看tomcat和severlet 然后看>
以上就是关于j2me 如何使用手机自带的数据库,怎么建立存储数据调用数据写入数据全部的内容,包括:j2me 如何使用手机自带的数据库,怎么建立存储数据调用数据写入数据、Android如何通过content provider构建媒体文件数据库麻烦告诉我、android studio怎么创建数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)